Создайте список с общими элементами и количеством повторений

#c# #linq #datagridview

Вопрос:

У меня есть 4 var из 4 разных datagridview, и я получаю выбор значения с помощью запроса Linq, подобного этому:

 var Sums = dataGridView1.Rows.Cast<DataGridViewRow>()
          .Where(row => row.Cells[7].Value != null)
        .GroupBy(row => row.Cells[7].Value.ToString()) //inserire colonna gruppo

        .Select(g => new { Gruppo = g.Key, Serie = g.Sum(row => Convert.ToInt32(row.Cells[1].Value)) });
 

Таким образом, каждый var выглядит примерно так:

 Gruppo | Serie

group1 |  3
group2 |  2
group3 |  7
 

То, что я пытаюсь сделать, — это получить список с пересечением нескольких списков и количеством повторений каждого элемента «Группы».

Результаты должны быть примерно такими:

 Gruppo | Repetition

group1 |  2 (if is present in two lists)
group2 |  3 (if is present in three lists)
group3 |  1 (if is present in one lists)
 

Теперь у меня есть общий элемент с этим кодом:

 var pp = Sums.Intersect(Sums2);
 

но найдите только элементы с одной и той же «группой» и одной и той же «серией», поэтому, если «группа» равна, а серия-нет, пересечение не работает.

Каков наилучший способ достичь этого?

Ответ №1:

Соберите их все вместе и используйте GroupBy снова с обоими свойствами:

 var gruppoRepetitions = Sums.Concat(Sums2).Concat(Sums3)
    .GroupBy(s => new{ s.Gruppo, s.Serie })
    .Select(g => new{ Gruppo = g.Key.Gruppo, Repetition = g.Count() });
 

Комментарии:

1. Я получаю две ошибки с этим кодом: s не определен, тип System.ValueTuple’2′ не определен или не импортирован

2. @Gabriele: какую версию C# вы используете? s Опечатка исправлена. Если вы не можете использовать значения, вы можете использовать анонимный тип. Я изменю его. Выполнено

3. хорошо, теперь это работает! Я удалил серию s.в группе только для того, чтобы получить то, что мне было нужно. Большое спасибо!