LINQ:无法将类型’System.Collections.Generic.IEnumerable ‘隐式转换为’int’
我从以下代码中收到错误:
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; 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()扩展名的数组
好吧,该查询可能返回多个值,因此您需要使用.FirstOrDefault()
或.FirstOrDefault()
扩展方法。
注意, Single()
只有在列表中只有一个元素时才有效, First()
只有在列表中至少有一个元素时才有效。 如果列表中没有元素, FirstOrDefault()
将恢复为默认值(0)。
根据您的确切需要,您必须选择:)
这么多错了。
首先,您尝试将可能很多转换的整数分配给数组中的单个整数。 这就是错误消息告诉你的。
此外,您展示的代码中没有任何地方是该数组已初始化。 因此,即使你调用类似.FirstOrDefault()
东西,你也会得到一个NullReferenceException
。 如果你能提供帮助,最好不要使用arrarys。 坚持使用IEnumerable。
此外,你是linq查询还有一个额外的步骤; 而不是检查Controls集合中每个控件的类型,您应该调用它的.OfType()
方法。
最后,linq的美妙之处在于你甚至不必编写for循环。 您只需编写一个语句来评估所有文本框。
IEnumerable dreamX; private void Form1_Load(object sender, EventArgs e) { sumX(); int totalX = dreamX.Sum(); } private void sumX() { dreamX = from control in Controls.OfType() where control.Name.StartsWith("box") select Convert.ToInt32(control.Text); }
FirstOrDefault()
会将IEnumerable
转换为int
。
实际上它在你的linq查询的输出结果中首次出现。