好吧,所以你想要去为每个列表,并确定它至少有一个其他的项目列表以及至少一个其他列表中没有的所有项目。
要做到这一点,首先要找到所有列表中的所有项目;那就是每个列表的“交集”。
一旦你有了这个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“ - >比较什么?第一个列表是所有比较的基础吗? –