旧的linq上有点生疏了。 如果我有2个集合EG NewCustomerList和OldCustomerList并查看是否已存在姓氏,我将如何在linq中执行此操作。我相信有很多方法。 SelectMany敲响了钟,但忘记了怎么做!
在forEach中我会做那样的事情。 linq中的等价物是什么?
foreach (var oldCustomer in OldCustomerList)
{
foreach (var newCustomer in NewCustomerList.Where(x => x.Surname == oldCustomer.Surname))
{
break;
}
}
有什么建议吗?非常感谢
答案 0 :(得分:4)
因此,您正在尝试查看旧客户姓氏的是否在新客户列表中?
一个简单的选择:进行连接并查看它是否为空:
if (OldCustomerList.Join(NewCustomerList, x => x.Surname, x => x.Surname,
(x, y) => null).Any())
{
...
}
(我使用了空投影,因为我们真的不关心连接结果。)
另一种选择:
var oldSurnames = new HashSet<string>(OldCustomrList.Select(x => x.Surname));
if (NewSurnameList.Any(x => oldSurnames.Contains(x.Surname))
{
...
}
我怀疑你可能会发现你实际上想要的结果是哪个姓氏是共同的...如果你能给我们更多的背景,我们可以帮助你更多。
答案 1 :(得分:2)
您可以通过以下方式执行此操作:
NewCustomerList.Where(n => OldCustomerList.Any(o => o.Surname == n.Surname))
答案 2 :(得分:1)
这是另一种方法,它也具有O(n + m)
复杂度+快速传递语义:
OldCustomerList.Select(cust => cust.Surname)
.Intersect(NewCustomerList.Select(cust => cust.Surname))
.Any();
IMO,它比明确的Enumerable.Join
更具可读性:“测试来自旧客户列表的姓氏的投影是否与新客户列表的姓氏投影有任何共同点”,非常接近问题陈述。