Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取错误:使用LINQ对嵌套的foreach循环计数时,无法从用法推断类型参数_C#_Linq - Fatal编程技术网

C# 获取错误:使用LINQ对嵌套的foreach循环计数时,无法从用法推断类型参数

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")

我正在尝试为嵌套的foreach循环创建LINQ查询

循环如下所示:

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");