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

SiC*_*SiC 20 .net c# linq hashset

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

    List<int> s1 = new List<int>();
    List<int> s2 = new List<int>();

    foreach (int i in s1)
    {
        if (s1.Contains(i))
        {
            //
        }
        else
        {
            //
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

List<int> omitted = s1.Difference(s2);
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 27

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

  • 布莱恩,我不这么认为.您在上面链接的方法是扩展方法.HashSet有一个ExceptWith方法,它从实例HashSet中破坏性地删除参数中的元素,但没有Except. (8认同)

lep*_*pie 26

IEnumerable<T> a, b;

var added = a.Except(b);
var removed = b.Except(a);
Run Code Online (Sandbox Code Playgroud)

  • @Brian,同样的警告也适用于你自己的答案.HashSet没有实现它自己的Except方法,所以你的答案也需要System.Linq. (3认同)
  • 请注意,这使用Enumerable.Except,因此您需要使用System.Linq。http://msdn.microsoft.com/en-us/library/bb300779.aspx (2认同)
  • @Deviant:但你的是O(n ^ 2)和我的O(n):) (2认同)
  • 这个答案表明您必须调用 except 两次才能获取添加和删除的项目。这一点很容易被忽视。 (2认同)

Rob*_*Qiu 5

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

HashSet.SymmetricExceptWith()