LINQ: 无法将类型为 'System.Collections.Generic.IEnumerable<int>' 的值隐式转换为 'int'。

5

我从下面的代码中收到一个错误:

int dreamX[];

private void Form1_Load(object sender, EventArgs e)
{ 
    sumX();
}

private void sumX()
{
    for (var i = 0; i < 8; i++)
    {
        dreamX[i] =
            from Control control in Controls
            where
                control.GetType() == typeof(TextBox)
                && control.Name.StartsWith("box")
            select Convert.ToInt32(((TextBox)control).Text);
    }
}

我遇到了这个错误,如何显式地转换它。

"无法隐式将类型 'System.Collections.Generic.IEnumerable<int>' 转换为 'int'"


嗯,你是怎么让 "int dreamX[];" 编译通过的?那是什么意思? - Joel Mueller
3
@Joel:给这个人一个机会吧!他正在学习并且显然很享受。 - Dabblernl
4个回答

14

这个查询可能会返回多个值,所以你需要使用 .Single(), .First() 或者.FirstOrDefault() 扩展方法之一。

请注意,如果列表中只有一个元素,则Single()可用,如果列表中至少有一个元素,则First()可用。如果列表中没有元素,则FirstOrDefault()将返回默认值(0)。

根据你的具体需求,你将需要选择哪种方法 :)


11

这里有很多问题。

首先,你试图将可能有多个转换后的整数分配给数组内的单个整数。这就是错误消息告诉你的。

另外,你展示的代码中没有初始化该数组的任何地方。因此,即使你调用类似 .FirstOrDefault() 的方法,最终也会得到一个NullReferenceException。如果可以的话,最好完全不使用数组,只需使用IEnumerable。

此外,你的linq查询还有一步多余;而不是检查Controls集合中每个控件的类型,你应该调用它的.OfType() 方法。

最后,linq的美妙之处在于你甚至不需要编写for循环。你只需要编写一个语句来评估所有文本框即可。

IEnumerable<int> dreamX;

private void Form1_Load(object sender, EventArgs e)
{ 
    sumX();
    int totalX = dreamX.Sum();
}

private void sumX()
{
    dreamX = from control in Controls.OfType<TextBox>()
             where control.Name.StartsWith("box")
             select Convert.ToInt32(control.Text);
}

8
你需要的是这个:

您需要的是:

int[] dreamX;
private void Form1_Load(object sender, EventArgs e)
        { 
         sumX();
        }
 private void sumX()
        {
                dreamX =( from Control control in Controls                  
                         where control.GetType() == typeof(TextBox) &&
                               control.Name.StartsWith("box")
                         select Convert.ToInt32(((TextBox)control).Text))
                                       .ToArray();             
        }

from子句生成一个IEnumerable集合。您可以使用.ToArray()扩展将其转换为数组。


3

FirstOrDefault() 方法将 IEnumerable<int> 转换为一个 int

实际上,它会返回你的 LINQ 查询结果中的第一个元素。


1
只有在至少有一个元素的情况下才会返回结果 :-),否则将返回0。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接