С# и linq

Автор Тема: С# и linq  (Прочитано 3156 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AgensАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 213
  • Карма: 0
С# и linq
« : 16-12-2020, 13:58:59 »
Добрый день.
Подскажите как с помощью linq сравнить две последовательности List классов и в первой последовательности поменять параметр (допустим ID), где ID берем из совпадения во второй последовательности.
Пока я умею только создавать новую последовательность:
Код - C# [Выбрать]
  1. var list3 = list1.SelectMany(e => list2
  2.                                                       .Where(eo => eo.Name == e.Name)
  3.                                                       .Select(eo => new {Name = e.Name, ID = e.ID}));
  4.  

Нужно просто в list1 поменять ID. Спасибо.
----
Как пример: найти всех учеников с одинаковыми именами и суммировать их возраст...
« Последнее редактирование: 16-12-2020, 18:17:30 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Онлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2457
  • Карма: 692
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: С# и linq
« Ответ #1 : 17-12-2020, 11:27:40 »
А слабо сделать пример, который хотя бы в интрепретаторе можно прогнать?  :)

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 573
  • Карма: 135
    • ПГСу Бложик
Re: С# и linq
« Ответ #2 : 25-12-2020, 20:15:04 »
1. На Linq свет клином не сошелся, это в любом случае синтаксический сахар и под капотом будет развернуто в простые циклы... так что лучше писать так, как понятнее лично Вам...
2. Вы бы поиском воспользовались или документацией, у List<> есть методы .Intersect(), .Except() и другие, предназначенные именно для сравнения последовательностей...


Как пример: найти всех учеников с одинаковыми именами и суммировать их возраст...
Пару строк кода....
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5.  
  6. class Man
  7. {
  8.         public string Name {get; set;}
  9.         public int Age {get; set;}
  10. }
  11. public class Program
  12. {
  13.     public static void Main()
  14.     {
  15.       List<Man> mans = new List<Man>();
  16.       mans.Add(new Man() { Name = "Vova", Age = 5 });
  17.       mans.Add(new Man() { Name = "Peta", Age = 7 });
  18.       mans.Add(new Man() { Name = "Vova", Age = 12 });
  19.  
  20.  
  21.       //LINQ
  22.       List<KeyValuePair<string, int>> result = mans
  23.                             .GroupBy(l => l.Name)
  24.                             .Select(cl => new KeyValuePair<string, int>
  25.                                         (
  26.                                           cl.First().Name,
  27.                                           cl.Sum(c => c.Age)
  28.                                         )).ToList();
  29.  
  30.       foreach (var a in result)
  31.         Console.WriteLine(a.ToString());
  32.  
  33.  
  34.       //LOOPS
  35.       Dictionary<string, int> nnn = new Dictionary<string, int>();
  36.       foreach (var m in mans)
  37.       {
  38.         if (nnn.ContainsKey(m.Name))
  39.           nnn[m.Name] += m.Age;
  40.         else
  41.           nnn.Add(m.Name, m.Age);
  42.       }
  43.  
  44.       foreach (var a in nnn)
  45.         Console.WriteLine(a.ToString());
  46.     }
  47. }

  Результат:
Цитировать
  [Vova, 17]
  [Peta, 7]
  [Vova, 17]
  [Peta, 7]
 
только все это пустое и как видно спокойно заменяется обычным циклом, что проще и понятнее. Это я к тому, что не нужно усложнять код только для того, что бы сделать его "умнее".

Онлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2457
  • Карма: 692
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: С# и linq
« Ответ #3 : 28-12-2020, 09:34:01 »
C Linq проще так:
Код - C# [Выбрать]
  1.       //LINQ
  2.       var result = mans
  3.                   .GroupBy(l => l.Name)
  4.                   .ToDictionary(cl => cl.First().Name, cl => cl.Sum(c => c.Age));