Вот оптимизированный метод расширения:
public static HashSet<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> series, IEqualityComparer<T> equalityComparer = null)
{
if (series == null)
throw new ArgumentNullException("series");
HashSet<T> set = null;
foreach (var values in series)
{
if (set == null)
set = new HashSet<T>(values, equalityComparer ?? EqualityComparer<T>.Default);
else
set.IntersectWith(values);
}
return set ?? new HashSet<T>();
}
Используйте это со следующим компаратором:
public class FilteredVMComparer : IEqualityComparer<FilteredVM>
{
public static readonly FilteredVMComparer Instance = new FilteredVMComparer();
private FilteredVMComparer()
{
}
public bool Equals(FilteredVM x, FilteredVM y)
{
return x.ID == y.ID;
}
public int GetHashCode(FilteredVM obj)
{
return obj.ID;
}
}
Нравится это:
series.IntersectAll(FilteredVMComparer.Instance)
Вы могли бы просто написать
series.Aggregate((a, b) => a.Intersect(b, FilteredVMComparer.Instance))
но полукольцо быть расточительным, потому что должны были бы построить несколько наборов.
Пересечение, что означает, что вы хотите получить окончательный список, все элементы которого могут быть найдены (по идентификатору) во всех списках входных данных? – adv12
Что бы вы хотели, чтобы результат был? Думаю, я понимаю, что вы хотите «Список'? –
Cyral
Я хотел бы получить список идентификаторов, которые находятся во внутренних списках – JohnCooling