2

我已经查看了这些问题,这些问题没有给我我想要的东西:Comparing arrays in C# and Compare Two Arrays Of different Lengths and Show Differences

我有未知数量的List未知长度的对象,因此可能有 2、10 等列表。

我考虑过使用类似集合的结构,但意识到虽然它可以确定所有列表是否相等,但它不会告诉我“列表 2 有元素 A 而不是元素 B,列表 3 缺少元素 C,而列表 7 有一个额外的元素 D。

最后,元素是对象,所以我必须实现一个 Equals() 函数来比较两个元素是否相等。例如,元素可以是car包含一个stringfor 制造商和一个intfor price 的对象。

4

1 回答 1

1

好的,因此您要查找每个列表并确定它具有的至少不在另一个列表中的项目,以及至少在另一个列表中没有的所有项目。

为此,首先要查找所有列表中的所有项目;那是每个列表的“交集”。

一旦你有了它,你就可以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

于 2013-02-04T15:37:38.220 回答