Язык 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 = 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";
Комментариев нет:
Отправить комментарий