2013-02-04 24 views
2

我已经查看了这些问题,它不给我的X#我想要什么:Comparing arrays in C#Compare Two Arrays Of Different Lengths and Show Differences深入DIFF名单

我有一个未知数量的未知长度的List的对象,所以有可以是2,10等列表。

我曾考虑过使用类似结构的设置,但意识到虽然它可以确定所有列表是否相等,但它不会告诉我“列表2具有元素A而不是元素B,列表3没有元素C,列表7具有额外的元件D.

最后,元件是对象,所以我必须实现一个等于()函数比较是否相等2层的元件。例如,该元件可以是持有一个stringcar对象对于制造商和int的价格

+3

问题是什么?比较数组或者创建'Equals'超载? –

+1

你只关心*会员*,还是关心职位?例如,你是否也想要“列表4与列表1具有所有相同的元素,但顺序不同?” (和D斯坦利是对的:你没有问题在你的问题,如果你想要一个答案,问一个问题。) –

+0

“列表2有元素A而不是元素B,列表3没有元素C,列表7有一个额外的元素D“ - >比较什么?第一个列表是所有比较的基础吗? –

回答

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方法那个对象。