LINQ似乎正在添加其索引(使用2参数重载到.Select
;我假设LINQ生成索引,因为字典没有)到使用字符串连接而不是添加的整数。
以下代码返回myStr_3
,myStr_13
,myStr_23
,即它添加字典索引i
和整数count
,就好像它们是字符串一样,因此1 + 3
变为13
而不是4
:
// myDictionary is <string, object>
int parmCount = parameters.Count; // 3
int count = parmCount; // Closure safety
var setValues = myDictionary.Select((d, i) => "myStr_" + i + count);
显然索引0相当于空字符串而不是“0”。怪异。
以下代码(注意额外的parens)会返回正确的结果; myStr_3
,myStr_4
,myStr_5
:
int parmCount = parameters.Count; // 3
int count = parmCount;
var setValues = myDictionary.Select((d, i) => "myStr_" + (i + count));
更新:由于"myStr_" + i
产生了“正确的结果”,我得出的结论是,在没有真正考虑如何使用i
的情况下,正在不正确地处理使用额外的整数变量。 LINQ的行为当然是完全正确的。我只是在累了的时候才需要停止发帖。
MSDN says:
selector的第二个参数表示从零开始的索引 源序列中的那个元素。
虽然索引类型没有拼写出来,但对我而言,单词“index”意味着数字类型。
为什么LINQ会将两个整数添加为字符串?
答案 0 :(得分:2)
为什么LINQ会将两个整数添加为字符串?
它不是LINQ,而是字符串连接,如果您有string + int + int
而没有任何()
,则所有内容都将被视为string
,因为ToString
方法将被调用操作数。
此:
"myStr_" + i + count
转向:
string.Concat("myStr_",i,count);
在内部调用每个参数ToString
。
但是当你有像这样的代码时:
"myStr_" + (i + count)
然后由于括号对i
和count
执行了更高precedence that +
operator.整数运算,然后它们的结果在字符串中连接。
作为旁注,Dictionary
不是有序集合,因此您不能确保每次都获得相同的订单。
请参阅:Dictionary C#
出于枚举的目的,字典中的每个项都被视为 表示值及其值的KeyValuePair结构 键。返回项目的顺序未定义。
编辑:您的评论:
我考虑过这个,但是:。选择((d,i)=&gt;“myStr_”+ i); (收费 变量计数)添加,而不是字符串连接。
它仍然是字符串连接。由于i
,您看到Select
的值已更改。在每个枚举中,i
的值是元素的索引,因此您得到类似的内容:
"myStr_" + 0
"myStr_" + 1
"myStr_" + 2
"myStr_" + 3
.....
同样,i
的这个值可能因同一元素而改变,因为字典不是有序集合。
请参阅提供索引的Enumerable.Select
重载。
selector的第二个参数表示从零开始的索引 源序列中的那个元素。如果是,这可以有用 元素按已知顺序,你想用一些东西做 特定指数的元素,