如何获取列表中没有的内容

本文关键字:何获取 获取 列表 | 更新日期: 2023-09-27 18:34:34

如果我有两个通用列表。 如何使用 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
 }

此代码尚未测试。

如何获取列表中没有的内容<T>

您可以使用

Except . 但是,假设您有一个自定义类型,则需要重写Equals()GetHashCode()以便它与 Linq 很好地配合使用。

这是因为 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()等效性,以便它们考虑其各个组件。

可以使用 IEnumerable 可用的 Except 方法。 它很容易实现。 您可以看到此处概述的示例:http://msdn.microsoft.com/en-us/library/bb336390.aspx

array2.ForEach(x => array1.Remove(x));

保留在 array1 中的就是您的结果

编辑:我看不见第一眼,物品不是"简单"的物体......正如詹姆斯所写,你需要覆盖平等