我有两个类型链接列表
Link
{
Title;
url;
}
我有两个列表(List lst1和List lst2类型为Link 现在我想要那些不在lst1但在lst2中的元素 我怎么能用lambda表达式做到这一点。 我不想用于循环。
答案 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();
答案 2 :(得分:0)
在设定的操作中,您正在寻找的是
一个减去相交的联合
所以 (list1 union list2)除(list1 intersect list2)
查看linq set operations的链接 https://msdn.microsoft.com/en-us/library/bb546153.aspx