在C#中查找List和IEnumerable对象的匹配字段

时间:2014-12-02 18:42:37

标签: c# linq

我可以通过漫长而乏味的方式完成我想要完成的任务,但我认为必须有一种方法可以使用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);
   }
}

2 个答案:

答案 0 :(得分:4)

注意:此解决方案仅适用于相同类型的序列。

Enumerable.Intersect<T>(IEnumerable<T>, IEnumerable<T>, IEqualityComparer<T>)


基本上,您希望使用linq使用自定义相等比较来查找两个序列之间的匹配,在您的情况下,它将与FirstNameLastName匹配进行比较。但是,如果两个人分享相同的名字,但他们是不同的人,会发生什么?如果这不是您域中的问题,请忽略该问题。

答案 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种不同的序列类型,这使得它不可避免。