C# 获取错误:使用LINQ对嵌套的foreach循环计数时,无法从用法推断类型参数
我正在尝试为嵌套的foreach循环创建LINQ查询 循环如下所示:C# 获取错误:使用LINQ对嵌套的foreach循环计数时,无法从用法推断类型参数,c#,linq,C#,Linq,我正在尝试为嵌套的foreach循环创建LINQ查询 循环如下所示: var c = 0; foreach(var e in elements) { foreach(var a in e.Attributes) { if(a.Name=="City" && a.GetValue().ToString() == "Oakland")
var c = 0;
foreach(var e in elements)
{
foreach(var a in e.Attributes)
{
if(a.Name=="City" && a.GetValue().ToString() == "Oakland")
c += 1;
}
}
我在找一个伯爵
我尝试过使用LINQ查询
int d = elements.SelectMany(e => e.Attributes)
.Count(a => a.Name == "City" &&
a.GetValue().ToString() == "Oakland");
但我得到了一个错误:
无法从用法推断方法Enumerable.SelectMany的类型参数。尝试显式指定类型参数
我尝试将SelectMany
替换为Select
,但出现了一个错误:
不包含名称定义且没有扩展方法
属性
的类型可能是动态的
(或装箱为对象
),因此编译器不知道它是一个集合。明确指定它是一个IEnumerable
:
int d=elements.SelectMany(e=>(IEnumerable)e.Attributes)
.Count(a=>a.Name==“城市”&&
a、 GetValue().ToString()=“奥克兰”);
下面是我描述的场景(明确指定类型):
属性的类型是什么 据推测,这是某种收藏。但是集合有多种风格,在这种情况下,编译器似乎无法隐式地确定集合中任何给定元素的类型 例如,假设
属性
的类型为IEnumerable
。在这种情况下,编译器会知道SelectMany()
应该是SelectMany()
,并且会隐式地为您确定
然而,在这种情况下,属性
似乎更为定制。为了便于讨论,我将调用类型AttributeCollection
。编译器无法确定该集合中的元素类型,因此它不知道隐式使用什么类型的参数来表示SelectMany()
。因此,它需要您显式地指定该类型参数
你的线索是:
foreach(var a in e.Attributes)
这行代码编译得很好,它告诉您属性
确实是一个集合。更重要的是,您需要确定a
的类型
为什么这行代码可以确定a
的类型,这可能不是完全直观的,但是SelectMany()
不能。我相信对这些东西的内部运作有更深入了解的人可以提供一些见解。但事实并非如此。你需要做的就是确定a
的类型并使用它
因此,例如,如果a
的类型为Attribute
(只是一个示例,我不知道类型,您需要在IDE中找到),那么您应该执行以下操作:
int d = elements.SelectMany<Attribute>(e => e.Attributes)
.Count(a => a.Name == "City" && a.GetValue().ToString() == "Oakland");
int d=elements.SelectMany(e=>e.Attributes)
.Count(a=>a.Name==“城市”&&a.GetValue().ToString()==“奥克兰”);
Hi Gilad,你不记得昨天的这个问题吗?被高度否决,现在被删除,显然在这里重新发布了其中一个答案。你是对的:)我只是希望它不会被删除,对于未来银行@GiladGreen中需要它的人来说,这真的很有帮助。还有助于我更好地理解LINQ。@sachin不客气:)@sachin-如果答案有助于你解决问题,请将其标记为已解决it@sachin-请编辑问题,并显示元素和属性的类型,以便此问题对将来的人更有帮助
int d = elements.SelectMany<Attribute>(e => e.Attributes)
.Count(a => a.Name == "City" && a.GetValue().ToString() == "Oakland");