C# 如何在IEnumerable的子列表成员上使用(或可以使用)Linq Intersect方法?
我正在做以下事情C# 如何在IEnumerable的子列表成员上使用(或可以使用)Linq Intersect方法?,c#,linq,c#-3.0,C#,Linq,C# 3.0,我正在做以下事情 //first I have a list of sports... List<string> sports = new List<string> {"football","basketball"} //then I have a list of partners who are offering that sport List<Partner> = Partner.GetAvailablePartners(); //Partner is
//first I have a list of sports...
List<string> sports = new List<string> {"football","basketball"}
//then I have a list of partners who are offering that sport
List<Partner> = Partner.GetAvailablePartners();
//Partner is a type that has a List<string> Sports members.
但我想它不起作用,因为我是在一个成员列表而不是根列表上工作的
这可以通过intersect(或其他linq)方法实现吗
Seth。Where()
和所有其他lINQ方法返回一个带有延迟迭代的IEnumerable
,而不是List
您不能将它们强制转换为
列表
如果需要列表
,请调用ToList()
使用intersect
使用两个IEnumerable的示例
var ids = original.Select(x => x.ID).Intersect(yourEnumerable);
如果确实需要列表中的结果,请在LINQ语句末尾调用ToList()。否则,您应该能够执行以下操作:
IEnumerable<Partner> partners = partners.Where(p => p.Sports.Intersect(sports).Count() == sports.Count);
IEnumerable partners=partners.Where(p=>p.Sports.Intersect(Sports.Count()==Sports.Count);
…或在结果列表中:
List<Partner> partners = partners.Where(p => p.Sports.Intersect(sports).Count() == sports.Count).ToList();
List partners=partners.Where(p=>p.Sports.Intersect(Sports.Count()==Sports.Count.ToList();
为什么不呢?你会得到什么错误?这会编译并运行。但是在上面的一行中,我得到了InvalidCastException…“无法强制转换类型为”的对象,而ListIterator“1”就是这样做的。我将我的合作伙伴列表转换为IEnumerable,然后Intersect子句运行良好。我很惊讶这是需要的。因为Intersect扩展了IEnumerable,但是(显然)没有列出编译器为什么没有给出错误。为什么其他扩展方法在列表上工作得很好?@SethSpearman:所有扩展方法在list
上都工作得很好。但是,它们中没有一个(除了ToList()
)返回List
。您没有得到编译器错误,因为您明确告诉编译器不要使用强制转换来给出错误。
List<Partner> partners = partners.Where(p => p.Sports.Intersect(sports).Count() == sports.Count).ToList();