2

如果我有两个通用列表。如何使用 LINQ 找到不在其他列表中的内容?

这是我的 obj 类:

 public class tobj
 {      
    public string column1;
    public string column2;
 }  

这是数组

 tobj[] array1 = 
 { 
        new tobj { "1", "1" }, new tobj { "2", "2" }, new tobj { "3", "3" } 
 };

 tobj[] array2 = 
 { 
     new tobj { "2", "2" }, new tobj { "3", "3" }, new tobj { "4", "4" } 
 };

 var diff = array1.FinfDiff(array2); 

 foreach (var value in diff)
 {
    Console.WriteLine(value.column1); // 1
 }

此代码尚未测试。

4

3 回答 3

4

您可以使用Except. 但是,鉴于您有一个自定义类型,您需要覆盖它以便它与 Linq 一起工作 Equals()GetHashCode()

这是因为 Linq 追求效率,所以它可以使用HashSet<T>和其他机制来快速确定项目是否可能等效(等效的项目必须具有相同的哈希码,否则您的哈希码是错误的)。所以仅仅实现是不够的,在自定义类中使用这种类型的方法时还Equals()必须实现。GetHashCode()

例如:

    public class tobj : IEquatable<tobj>
    {
        public string column1;
        public string column2;

        public bool Equals(tobj other)
        {
            return other != null ? Equals(column1, other.column1) && Equals(column2, other.column2) : false;
        }

        public override bool Equals(object obj)
        {
            return Equals(obj as tobj);
        }

        public override int GetHashCode()
        {
            // seed the code
            int hash = 13;

            // use some primes to mix in the field hash codes...
            hash = hash * 17 + column1.GetHashCode();
            hash = hash * 17 + column2.GetHashCode();

            return hash
        }
    }  

现在您已经覆盖了 GetHashCode() 和 Equals()(我也喜欢实现IEquatable<T>自己),您可以使用Except()

        var results = array1.Except(array2);

        foreach (var i in results)
        {
            Console.WriteLine(i.column1 + ":" + i.column2);
        }

我建议在哈希码算法上查看这个 SO 线程,以及实现一个好的技巧。

此外,作为旁注,某些类型(例如KeyValuePairTuple和匿名类型)已经实现Equals()GetHashCode()正确地实现了等价性,它们考虑到了它们的各个组件。

于 2012-05-18T20:25:45.807 回答
2

您可以使用 IEnumerable 可用的 except 方法。这很容易实现。您可以在此处看到一个示例:http: //msdn.microsoft.com/en-us/library/bb336390.aspx

于 2012-05-18T20:17:45.220 回答
0
array2.ForEach(x => array1.Remove(x));

留在array1中的是你的结果

编辑: 我不看第一眼,项目不是“简单”的对象......正如詹姆斯所写,你需要覆盖 equal

于 2012-05-18T20:27:46.877 回答