有没有办法在c#中获得两组对象之间的差异?

我想在c#中获得两组int之间的区别。 给定s1和s2我想返回那些在s1而不在s2中的int。 我可以做一些事情,比如:

List s1 = new List(); List s2 = new List(); foreach (int i in s1) { if (s1.Contains(i)) { // } else { // } } 

但我想知道是否有人能指出更清洁的东西。 我想做点什么

 List omitted = s1.Difference(s2); 

不确定是否有任何人可能指出的现有方法或LINQ结构? 谢谢。

我想你想要HashSet.Except 。 也就是说,使用HashSets,而不是使用Lists,然后操作可用。 如果您所表示的内容实际上是一个“设置”,这是一个更好的类型。 (如果你已经有了一个列表,你可以从中创建一个’新的HashSet’。)

 IEnumerable a, b; var added = a.Except(b); var removed = b.Except(a); 
 List s1 = new List(); List s2 = new List(); return sl.FindAll( i => !s2.Contains(i) ) 
来自s1中的x
哪里!  s2.contains(x)的
选择x

当你需要找到两个IEnumerable之间的无序差异时,这两个扩展方法可能很方便(它与leppie包装器给出的扩展方法的答案大致相同):

 public class EnumerableDifferences { public IEnumerable Added { get; } public IEnumerable Removed { get; } public EnumerableDifferences(IEnumerable added, IEnumerable removed) { Added = added; Removed = removed; } } public static class EnumerableExtensions { public static HashSet ToHashSet(this IEnumerable source, IEqualityComparer comparer) { return new HashSet(source, comparer); } public static IEnumerable ExceptBy(this IEnumerable first, IEnumerable second, Func keySelector, IEqualityComparer keyComparer = null) { return first .ExceptBy(keySelector, second.Select(keySelector), keyComparer); } public static IEnumerable ExceptBy(this IEnumerable source, Func keySelector, IEnumerable keys, IEqualityComparer keyComparer = null) { var secondKeys = keys.ToHashSet(keyComparer); foreach (var firstItem in source) { var firstItemKey = keySelector(firstItem); if (!secondKeys.Contains(firstItemKey)) { yield return firstItem; } } } public static EnumerableDifferences DifferencesBy(this IEnumerable first, IEnumerable second, Func keySelector, IEqualityComparer keyComparer = null) { keyComparer = keyComparer ?? EqualityComparer.Default; var removed = first.ExceptBy(second, keySelector, keyComparer); var added = second.ExceptBy(first, keySelector, keyComparer); var result = new EnumerableDifferences(added, removed); return result; } public static EnumerableDifferences Differences(this IEnumerable first, IEnumerable second, IEqualityComparer comparer = null) { return first .DifferencesBy(second, x => x, comparer); } } public static class Program { public static void Main(params string[] args) { var l1 = new[] { 'a', 'b', 'c' }; var l2 = new[] { 'a', 'd', 'c' }; var result = l1.Differences(l2); Console.ReadKey(); } } 

另一个有用的API,获得对称差异:

HashSet.SymmetricExceptWith()