#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.в группе только для того, чтобы получить то, что мне было нужно. Большое спасибо!