好的,因此您要查找每个列表并确定它具有的至少不在另一个列表中的项目,以及至少在另一个列表中没有的所有项目。
为此,首先要查找所有列表中的所有项目;那是每个列表的“交集”。
一旦你有了它,你就可以Except
完成所有的工作。给定列表中的所有项目except
都会为您提供交集中但不在该特定列表中的项目,交集中Except
的项目列表是交集中缺少的所有项目。
public static IEnumerable<SetDifference<T>> ComputeDifferences<T>(IList<List<T>> lists)
{
if (lists.Count == 0)
yield break;
var intersection = new HashSet<T>(lists.First());
foreach (var list in lists.Skip(1))
{
intersection.IntersectWith(list);
}
var output = new List<SetDifference<T>>();
foreach (var list in lists)
{
yield return new SetDifference<T>(
list: list,
additionalObjects: list.Except(intersection),
missingObjects: intersection.Except(list));
}
}
这是用于提供输出的简单数据保持器。
public class SetDifference<T>
{
public SetDifference(List<T> list, IEnumerable<T> additionalObjects,
IEnumerable<T> missingObjects)
{
List = list;
AdditionalObjects = additionalObjects;
MissingObjects = missingObjects;
}
public List<T> List { get; private set; }
public IEnumerable<T> AdditionalObjects { get; private set; }
public IEnumerable<T> MissingObjects { get; private set; }
}
请注意,由于我使用HashSet
的是 LINQ 以及其他集合操作,因此它将依赖于GetHashCode
每个项目的方法,因此它必须具有给定该对象的方法的适当实现Equals
。