c# Linq ForEach
Хочу немного отрефакторить код, подскажите, как можно переписать такую запись?
var result = new List<string>();
foreach (var value in values)
{
if (!childrens.Any(i => value == i.Name))
{
result.Add(value);
}
}
Какой записи я хочу добиться:
var result = values
.ToList()
.ForEach(x => ???)
Есть ли возможность вообще переписать это с помощью ForEach? Заранее всем спасибо!
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Не надо ForEach:
result = values.Where(value => !childrens.Any(i => value == i.Name)).ToList();
Хотя можно ещё оптимизировать как-то так, если values уникальные и порядок их следования не важен:
children_names = childrens.Select(i => i.Name).ToHashSet()
result = values.ToHashSet().ExceptWith(children_names).ToList();
А если не уникальные и/или важен порядок, то можно просто использовать HashSet для проверки вхождения, всё-равно будет возможно быстрее в каких-то случаях, чем гонять Any на каждый элемент:
children_names = childrens.Select(i => i.Name).ToHashSet()
result = values.Where(value => !children_names.Contains(value)).ToList();