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

C# 在C中查找列表和IEnumerable对象的匹配字段#,c#,linq,C#,Linq,我有一个漫长而乏味的方法来完成我想要完成的任务,但我认为一定有一种方法可以使用Linq或其他更简洁高效的技术来实现这一点。我有一个IEnumberable,让我们用firstName和lastName属性来称呼它people1,我还有一个列表,让我们用firstName和lastName属性来称呼它people2。我只需要存储people2的firstName和lastName值与people1匹配的people1 这个伪代码不起作用,但它可能比那个冗长的解释更好地解释了我希望实现的目标: pe

我有一个漫长而乏味的方法来完成我想要完成的任务,但我认为一定有一种方法可以使用Linq或其他更简洁高效的技术来实现这一点。我有一个IEnumberable,让我们用firstName和lastName属性来称呼它people1,我还有一个列表,让我们用firstName和lastName属性来称呼它people2。我只需要存储people2的firstName和lastName值与people1匹配的people1

这个伪代码不起作用,但它可能比那个冗长的解释更好地解释了我希望实现的目标:

people3 = people1.Select(x => x.firstName IN (people2.firstName) && x.lastName IN (people2.lastName))
我是个新手,所以我想出的唯一方法就是通过people2列表元素循环,比较people1和是否匹配,并将其存储在people3中。这会起作用,但我认为有更好的方法来做,我正在尝试学习新的东西,所以我想我会把它扔出去,看看你们伟大的头脑想出了什么。:)

更新:

在玩了一会儿之后,我很接近了,但似乎不知道如何将匹配项添加到新的IEnumerable对象中。这是我的代码,它在“添加”行失败:

IEnumerable people3=null;
foreach(var人员中的人员1)
{
if(people2.Exists(x=>x.FirstName==people1.FirstName))
{
人3.添加(人);
}
}

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



基本上,您希望使用linq通过自定义相等比较来查找两个序列之间的匹配,在您的示例中,这将比较
FirstName
LastName
匹配的true。但是,如果两个人的名字完全相同,但他们是不同的人,会发生什么呢?如果这不是您所在领域的问题,请忽略该问题。

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



基本上,您希望使用linq通过自定义相等比较来查找两个序列之间的匹配,在您的示例中,这将比较
FirstName
LastName
匹配的true。但是,如果两个人的名字完全相同,但他们是不同的人,会发生什么呢?如果这不是您所在领域的问题,请忽略该问题。

我知道这可能不是最优雅的解决方案,但这是我能够找到实现目标的最佳方法。如果你有任何改进,我愿意把这段代码做得更好一点

//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;
//填充IEnumerable people 1
//填充列表人员2
List people3=新列表();
foreach(var人员中的人员1)
if(people2.Exists)(x=>x.FirstName==person.FirstName)
人3.添加(人);
people1=people3;

我希望避免for循环,但我认为我有两种不同的序列类型,这是不可避免的。

我知道这可能不是最优雅的解决方案,但这是我能够找出如何实现我的目标的最佳方法。如果您有任何改进,我愿意将这段代码作为稍微好一点

//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;
//填充IEnumerable people 1
//填充列表人员2
List people3=新列表();
foreach(var人员中的人员1)
if(people2.Exists)(x=>x.FirstName==person.FirstName)
人3.添加(人);
people1=people3;

我希望避免for循环,但我认为我有两种不同的序列类型这一事实已经不可避免了。

您可以对多个字段使用join:根据您的更新,这样做是错误的。首先,
people3
甚至从未初始化为非空值,因此对其调用任何成员都不会起作用。其次,
IEnumerable
没有添加()方法。第三,正确的解决方案将涉及组合现有的
IEnumerable
实例以形成一个新实例;您不必显式创建一个实例,因为它将由您正在使用的任何组合机制返回。我知道IEnumerable没有添加项,我只是试图展示我正在尝试的内容我想我应该这么说。我的问题是我能找到人1和人2之间的匹配,但我不能把结果放在任何地方。对我来说,一个可以接受的结果,似乎你暗示的是正确的方法,就是删除不匹配。我同意这一点,你能提供一些示例代码吗?我不确定w来删除元素。您可以对多个字段使用join:每次更新都是错误的。首先,
people3
从未初始化为非空值,因此对其调用任何成员都不会起作用。其次,
IEnumerable
没有
Add()
方法。第三,正确的解决方案将涉及组合现有的
IEnumerable
实例以形成一个新实例;您不必显式创建一个实例,因为它将由您正在使用的任何组合机制返回。我知道IEnumerable没有添加项,我只是试图展示我正在尝试的内容我想我应该这么说。我的问题是我能找到人1和人2之间的匹配,但我不能把结果放在任何地方。对我来说,一个可以接受的结果,似乎你暗示的是正确的方法,就是删除不匹配。我同意这一点,你能提供一些示例代码吗?我不确定w删除元素。这还不错,但问题似乎暗示这两个枚举属于不同的元素类型。LINQ
join
可能更合适,具体取决于实际情况。@PeterDuniho:我看不出问题在哪里暗示这两个序列属于不同的类型,特别是什么指示了这一点?因为/他根据元素的属性而不是类型本身来描述列表