我可以通过漫长而乏味的方式完成我想要完成的任务,但我认为必须有一种方法可以使用Linq或其他一些更有效的技术来实现这一目标。我有一个IEnumberable让我们用属性firstName和lastName调用people1,我也有一个List让我们用firstName和lastName属性调用people2。我只需要存储people1,其中people2的firstName和lastName值与people1的值相同。
这个伪代码不起作用,但它可以更好地解释我希望实现的内容,而不是那个冗长的解释:
people3 = people1.Select(x => x.firstName IN (people2.firstName) && x.lastName IN (people2.lastName))
我对此有点新意,所以我想出的唯一方法是循环遍历people2列表元素,比较people1以及是否匹配将其存储在people3中。这将有效,但我假设有一个更好的方法来做到这一点,我正在努力学习新的东西,所以我想我会把它扔出去看看你的伟大思想提出了什么。 :)
更新:
在玩了一下之后,我很接近,但似乎无法弄清楚如何将匹配项添加到新的IEnumerable对象。这是我的代码,它在“添加”行中失败:
IEnumerable<dynamic> people3 = null;
foreach(var person in people1)
{
if(people2.Exists(x => x.FirstName == people1.FirstName))
{
people3.Add(person);
}
}
答案 0 :(得分:4)
注意:此解决方案仅适用于相同类型的序列。
Enumerable.Intersect<T>(IEnumerable<T>, IEnumerable<T>, IEqualityComparer<T>)
基本上,您希望使用linq使用自定义相等比较来查找两个序列之间的匹配,在您的情况下,它将与FirstName
和LastName
匹配进行比较。但是,如果两个人分享相同的名字,但他们是不同的人,会发生什么?如果这不是您域中的问题,请忽略该问题。
答案 1 :(得分:0)
我知道这可能不是最优雅的解决方案,但这是我能够弄清楚如何实现目标的最佳方式。如果你有所改进,我愿意让这段代码变得更好。
//populate IEnumerable<dynamic> people1
//populate List<dynamic> people2
List<dynamic> people3 = new List<dynamic>();
foreach (var person in people1)
if(people2.Exists(x=>x.FirstName==person.FirstName)
people3.Add(person);
people1 = people3;
我希望避免使用for循环,但我认为我有2种不同的序列类型,这使得它不可避免。