Разное > Разное

С# и 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));

Навигация

[0] Главная страница сообщений

Перейти к полной версии