如何使用lambda表达式</object>找到c#中两个LIST <object>的区别

时间:2015-04-10 12:50:51

标签: c# linq

我有两个类型链接列表

Link
{
    Title;
    url;
}

我有两个列表(List lst1和List lst2类型为Link 现在我想要那些不在lst1但在lst2中的元素 我怎么能用lambda表达式做到这一点。 我不想用于循环。

3 个答案:

答案 0 :(得分:8)

供参考比较:

list2.Except(list1);

对于价值比较,您可以使用:

list2.Where(el2 => !list1.Any(el1 => el1.Title == el2.Title && el1.url == el2.url));

答案 1 :(得分:0)

class CompareLists
{        
    static void Main()
    {
        // Create the IEnumerable data sources. 
        string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
        string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");

        // Create the query. Note that method syntax must be used here.
        IEnumerable<string> differenceQuery =
          names1.Except(names2);

        // Execute the query.
        Console.WriteLine("The following lines are in names1.txt but not names2.txt");
        foreach (string s in differenceQuery)
            Console.WriteLine(s);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/* Output:
     The following lines are in names1.txt but not names2.txt
    Potra, Cristina
    Noriega, Fabricio
    Aw, Kam Foo
    Toyoshima, Tim
    Guy, Wey Yuan
    Garcia, Debra
     */

修改

使用Except是正确的方法。如果你的类型重写了Equals和GetHashCode,或者你只对引用类型相等感兴趣(即两个引用只是&#34;等于&#34;如果它们引用完全相同的对象),你可以使用:< / p>

var list3 = list1.Except(list2).ToList();

如果您需要表达一种自定义的平等观念,例如通过ID,您需要实现IEqualityComparer。例如:

public class IdComparer : IEqualityComparer<CustomObject>
{
    public int GetHashCode(CustomObject co)
    {
        if (co == null)
        {
            return 0;
        }
        return co.Id.GetHashCode();
    }

    public bool Equals(CustomObject x1, CustomObject x2)
    {
        if (object.ReferenceEquals(x1, x2))
        {
            return true;
        }
        if (object.ReferenceEquals(x1, null) ||
            object.ReferenceEquals(x2, null))
        {
            return false;
        }
        return x1.Id == x2.Id;
    }
}

然后使用:

var list3 = list1.Except(list2, new IdComparer()).ToList();

编辑:如评论中所述,这将删除任何重复的元素;如果你需要保留重复项,请告诉我们......从list2创建一个集合并使用类似的东西可能最简单:

var list3 = list1.Where(x =&gt;!set2.Contains(x))。ToList();

Difference between two lists

答案 2 :(得分:0)

在设定的操作中,您正在寻找的是

一个减去相交的联合

所以 (list1 union list2)除(list1 intersect list2)

查看linq set operations的链接 https://msdn.microsoft.com/en-us/library/bb546153.aspx