Разное > Разное
С# и linq
(1/1)
Agens:
Добрый день.
Подскажите как с помощью linq сравнить две последовательности List классов и в первой последовательности поменять параметр (допустим ID), где ID берем из совпадения во второй последовательности.
Пока я умею только создавать новую последовательность:
--- Код - C# [Выбрать] ---var list3 = list1.SelectMany(e => list2 .Where(eo => eo.Name == e.Name) .Select(eo => new {Name = e.Name, ID = e.ID}));
Нужно просто в list1 поменять ID. Спасибо.
----
Как пример: найти всех учеников с одинаковыми именами и суммировать их возраст...
Дмитрий Загорулькин:
А слабо сделать пример, который хотя бы в интрепретаторе можно прогнать? :)
Владимир Шу:
1. На Linq свет клином не сошелся, это в любом случае синтаксический сахар и под капотом будет развернуто в простые циклы... так что лучше писать так, как понятнее лично Вам...
2. Вы бы поиском воспользовались или документацией, у List<> есть методы .Intersect(), .Except() и другие, предназначенные именно для сравнения последовательностей...
--- Цитата: Agens от 16-12-2020, 13:58:59 ---Как пример: найти всех учеников с одинаковыми именами и суммировать их возраст...
--- Конец цитаты ---
Пару строк кода....
--- Код - C# [Выбрать] ---using System;using System.Collections.Generic;using System.Linq; class Man { public string Name {get; set;} public int Age {get; set;} }public class Program{ public static void Main() { List<Man> mans = new List<Man>(); mans.Add(new Man() { Name = "Vova", Age = 5 }); mans.Add(new Man() { Name = "Peta", Age = 7 }); mans.Add(new Man() { Name = "Vova", Age = 12 }); //LINQ List<KeyValuePair<string, int>> result = mans .GroupBy(l => l.Name) .Select(cl => new KeyValuePair<string, int> ( cl.First().Name, cl.Sum(c => c.Age) )).ToList(); foreach (var a in result) Console.WriteLine(a.ToString()); //LOOPS Dictionary<string, int> nnn = new Dictionary<string, int>(); foreach (var m in mans) { if (nnn.ContainsKey(m.Name)) nnn[m.Name] += m.Age; else nnn.Add(m.Name, m.Age); } foreach (var a in nnn) Console.WriteLine(a.ToString()); }}
Результат:
--- Цитировать --- [Vova, 17]
[Peta, 7]
[Vova, 17]
[Peta, 7]
--- Конец цитаты ---
только все это пустое и как видно спокойно заменяется обычным циклом, что проще и понятнее. Это я к тому, что не нужно усложнять код только для того, что бы сделать его "умнее".
Дмитрий Загорулькин:
C Linq проще так:
--- Код - C# [Выбрать] --- //LINQ var result = mans .GroupBy(l => l.Name) .ToDictionary(cl => cl.First().Name, cl => cl.Sum(c => c.Age));
Навигация
Перейти к полной версии