好吧,所以你想要去爲每個列表,並確定它至少有一個其他的項目列表以及至少一個其他列表中沒有的所有項目。
要做到這一點,首先要找到所有列表中的所有項目;那就是每個列表的「交集」。
一旦你有了這個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
方法那個對象。
問題是什麼?比較數組或者創建'Equals'超載? –
你只關心*會員*,還是關心職位?例如,你是否也想要「列表4與列表1具有所有相同的元素,但順序不同?」 (和D斯坦利是對的:你沒有問題在你的問題,如果你想要一個答案,問一個問題。) –
「列表2有元素A而不是元素B,列表3沒有元素C,列表7有一個額外的元素D「 - >比較什麼?第一個列表是所有比較的基礎嗎? –