我从以下代码中收到错误:
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'”
答案 0 :(得分:13)
那么,该查询可能会返回多个值,因此您需要使用.Single()
,.First()
或.FirstOrDefault()
扩展方法。
请注意,Single()
只有在列表中只有一个元素时才有效,First()
仅在至少有一个}时才有效{列表中的em>元素。如果列表中没有元素,则FirstOrDefault()
将恢复为默认值(
根据您的确切需要,您必须选择:)
答案 1 :(得分:11)
这么多错了。
首先,您尝试将可能多个转换的整数分配给数组中的单个整数。这就是错误消息告诉你的。
此外,您展示的代码中没有任何地方是该数组已初始化。因此,即使您拨打.FirstOrDefault()
之类的内容,您最终也会使用NullReferenceException
。如果你能提供帮助,最好不要使用arrarys。坚持使用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);
}
答案 2 :(得分: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 :(得分:3)
FirstOrDefault()
会将IEnumerable<int>
变为int
。
实际上,它会在你的linq查询的输出结果中首次出现。