Как считать повторяющиеся элементы в datagridview - PullRequest
0 голосов
/ 07 марта 2012

У меня есть столбец datagridview1, заполненный данными: Room1, Room2, Room3, Room1, Room3, а также некоторые данные в строке, так что это выглядит так:

Name, Time, Room
name1, 10,  Room1
name2, 44,  Room2
name3, 1,   Room3
name4, 12,  Room1
.................

Я хотел бы посчитать число или повторы - 2x Room1, 1x Room2, 2x Room3 и добавить кумулятивные значения времени.

Так должно выглядеть:

Room    |  Cumulative_Time
-------------------------
Room1   |  22 
Room2   |  44

И добавить его в другое представление данных .. Есть идеи как это сделать?

Ответы [ 3 ]

1 голос
/ 07 марта 2012

А вот и ароматы лямбды и linq:

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);
    }

}

Выход:

lambda version

linq version

0 голосов
/ 07 марта 2012

Если вы используете POCO в качестве источника данных, это должно решить вашу проблему.

// 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()});
0 голосов
/ 07 марта 2012

Если ваши данные поступают из запроса, вы можете заполнить вторую сетку запросом, который использует функцию суммы по времени, сгруппированную по полю комнаты

SELECT Room, Sum(Time) from data_table group by Room

Если вы не хотите / можетене использовать запрос SQL, вы могли бы сделать это с помощью Linq, но я не могу помочь вам с синтаксисом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...