Страницы

Поиск по вопросам

среда, 24 апреля 2019 г.

В C# необходимо отредактировать несколько элементов коллекции через LINQ запрос

Язык C#, LINQ, Работа с несколькими элементами коллекции элементов.
Уважаемые коллеги прошу о помощи! Есть коллекция элементов. Мне необходимо выбрать все элементы с "Company=Microsoft" и изменить в этой же коллекции на "Company=12345" через LINQ запрос
Код:
namespace GroupByLinq { class Phone { public string Name { get; set; } public string Company { get; set; } }
class Program { static void Main(string[] args) { List phones = new List { new Phone {Name="Lumia 430", Company="Microsoft" }, new Phone {Name="Mi 5", Company="Xiaomi" }, new Phone {Name="LG G 3", Company="LG" }, new Phone {Name="iPhone 5", Company="Apple" }, new Phone {Name="Lumia 930", Company="Microsoft" }, new Phone {Name="iPhone 6", Company="Apple" }, new Phone {Name="Lumia 630", Company="Microsoft" }, new Phone {Name="LG G 4", Company="LG" } };
//Вот здесь что-то необходимо поправить или присвоения вовсе не должно быть phones = phones.SelectMany(x => x.Company == "Microsoft", p => new Phone { Name = p.Name, Company = "Citrus" }).ToList();
foreach (Phone g in phones) Console.WriteLine(g.Company + " / " + g.Name);
Console.Read(); } } }


Ответ

Linq не предназначен для изменения данных, он используется для запросов, поэтому я рекомендую вам воспользоваться обычным циклом, но если очень захотеть, можно написать примерно так:
phones = phones .Select(p => p.Company == "Microsoft" ? new Phone { Name = p.Name, Company = "12345" } : p) .ToList();
Этот подход плох тем, что он не изменяет старые объекты, а создает новые:
а) вы должны учесть что где-то могут остаться ссылки на старые phone, которых теперь нет в новой коллекции;
б) если вы добавите в класс новые свойства - вам придется найти каждый такой запрос и откорректировать его.
Подумайте хорошенько и поймете, что такой вариант будет гораздо лучше (да и, кстати, не сильно многословнее):
for (int i = 0; i < phones.Count; ++i) if (phones[i].Company == "Microsoft") phones[i].Company = "12345";
и да, с помощью Linq вы можете выбрать нужные телефоны и итерировать по ним, это тоже корректное решение (объекты остаются те же самые, с помощью Linq выбираем из них нужные):
foreach (var phone in phones.Where(p => p.Company == "Microsoft")) phone.Company = "12345";
А в идеале вам вообще нужно завести отдельный класс для компаний, а в телефоне иметь ссылку на него, тогда смена наименования компании превратится во что-то такое:
var company = companies.First(c => c.Name == "Microsoft"); company.Name = "12345";

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

Отправить комментарий