2013-02-04 23 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方法那個對象。