Reputation: 3689
I have datagridview1 column filled with data: Room1, Room2, Room3, Room1, Room3, and also some data in row so it's like this:
Name, Time, Room
name1, 10, Room1
name2, 44, Room2
name3, 1, Room3
name4, 12, Room1
.................
What i'd like to to is to count number or repeats - 2x Room1, 1x Room2, 2x Room3 and add cumulative time values.
So it should look like:
Room | Cumulative_Time
-------------------------
Room1 | 22
Room2 | 44
And add it to another datagridview.. Any ideas how to do it?
Upvotes: 0
Views: 939
Reputation: 844
Assuming you use POCOs as your DataSource, this should solve your problem.
// Get data from DataGridView
var dts = DataGridView.DataSource;
// Get list of rooms
var rooms = dts.Select(d=>d.Room).Distinct();
// Populate new DataGrid
NewDataGridView.DataSource = rooms
.Select(r => new {Room = r,
Cumulative_Time = dts.Where(d => d.room == r).Select(d => d.time).Sum()});
Upvotes: 0
Reputation: 2775
Here you go with the lambda and linq flavours:
public List<Room> GetRooms()
{
return new List<Room>(){new Room(){Name = "Room1", Time= 10},
new Room(){Name = "Room1", Time= 20},
new Room(){Name = "Room2", Time= 10},
new Room(){Name = "Room2", Time= 30},
new Room(){Name = "Room2", Time= 50},
new Room(){Name = "Room4", Time= 25},
new Room(){Name = "Room3", Time= 50},
new Room(){Name = "Room3", Time= 15},
new Room(){Name = "Room3", Time= 30},
new Room(){Name = "Room3", Time= 40}};
}
[TestMethod]
public void CheckSumsLambda()
{
var rooms = GetRooms();
var results = rooms.GroupBy(x => x.Name).Select(x => new { RoomName = x.Key, Occurences = x.Count(), Cumulativetime = x.Sum(y => y.Time) });
Console.WriteLine("Lambda flavour");
foreach (var result in results)
{
Console.WriteLine("{0}x {1} | {2}", result.Occurences, result.RoomName, result.Cumulativetime);
}
}
[TestMethod]
public void CheckSumsLinq()
{
var rooms = GetRooms();
var results = from r in rooms
group r by r.Name
into g
select new { RoomName = g.Key, Occurences = g.Count(), Cumulativetime = g.Sum(y => y.Time) };
Console.WriteLine("Linq flavour");
foreach (var result in results)
{
Console.WriteLine("{0}x {1} | {2}", result.Occurences, result.RoomName, result.Cumulativetime);
}
}
The output:
Upvotes: 1
Reputation: 1527
If your data comes from a query, you could populate your second grid with a query that uses a sum function on Time, grouped by the Room field
SELECT Room, Sum(Time) from data_table group by Room
If you don't want/can't use a SQL query, you could do it using Linq, but I can't help you with the syntax...
Upvotes: 0