为什么LINQ将其索引视为字符串?

时间:2014-12-17 16:36:42

标签: c# .net linq closures

LINQ似乎正在添加其索引(使用2参数重载到.Select;我假设LINQ生成索引,因为字典没有)到使用字符串连接而不是添加的整数。

以下代码返回myStr_3myStr_13myStr_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_3myStr_4myStr_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会将两个整数添加为字符串?

1 个答案:

答案 0 :(得分:2)

  

为什么LINQ会将两个整数添加为字符串?

它不是LINQ,而是字符串连接,如果您有string + int + int而没有任何(),则所有内容都将被视为string,因为ToString方法将被调用操作数。

此:

"myStr_" + i + count

转向:

string.Concat("myStr_",i,count);

在内部调用每个参数ToString

但是当你有像这样的代码时:

"myStr_" + (i + count)

然后由于括号对icount执行了更高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的第二个参数表示从零开始的索引   源序列中的那个元素。如果是,这可以有用   元素按已知顺序,你想用一些东西做   特定指数的元素,