c# Linq ForEach

Рейтинг: 0Ответов: 1Опубликовано: 02.03.2023

Хочу немного отрефакторить код, подскажите, как можно переписать такую запись?

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? Заранее всем спасибо!

Ответы

▲ 0Принят

Не надо 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();