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

C# 为什么LINQ将其索引视为字符串?,c#,.net,linq,closures,C#,.net,Linq,Closures,LINQ似乎正在使用字符串连接而不是加法将其索引(使用2参数重载到。选择;我假设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; // C

LINQ似乎正在使用字符串连接而不是加法将其索引(使用2参数重载到
。选择
;我假设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);
更新:由于
“myStr_”+i
产生了“正确的结果”,我突然得出结论,使用额外的整数变量处理不当,而没有真正考虑如何使用
i
。林克的行为当然是完全正确的。当我累了的时候,我只需要停止发问

MSDN:

选择器的第二个参数表示从零开始的 源序列中的那个元素

虽然没有详细说明索引类型,但对我来说,这和“索引”一词意味着数字类型

为什么LINQ将两个整数相加就好像它们是字符串一样

为什么LINQ将两个整数相加就好像它们是字符串一样

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

这:

变成这样:

string.Concat("myStr_",i,count);
它在内部对每个参数调用,
ToString

但当您有如下代码时:

"myStr_" + (i + count)
然后,由于括号具有更高的整数,因此对
i
count
执行算术运算,然后将它们的结果连接到字符串中

作为旁注,
字典
不是一个有序的集合,因此您不能确保每次都获得相同的顺序

见:

出于枚举的目的,字典中的每一项都被视为 表示值及其属性的KeyValuePair结构 钥匙返回项目的顺序未定义

编辑:请发表评论:

我已经考虑过了,但是:。选择((d,I)=>“myStr_u”+I);(没有免费的 变量计数)不进行加法,而不是字符串连接

它仍然是字符串连接。由于
Select
,您将看到
i
的值发生了更改。在每个枚举中,
i
的值是元素的索引,因此可以得到如下结果:

"myStr_" + 0
"myStr_" + 1
"myStr_" + 2
"myStr_" + 3
.....
同样,对于同一个元素,
i
的这个值可能会改变,因为字典不是有序集合

请参阅提供索引的重载

选择器的第二个参数表示从零开始的 源序列中的那个元素。如果 元素的顺序是已知的,您希望使用 特定索引处的元素


@CharlesBurns,这仍然是字符串连接,但只是在每个枚举中,
i
的值由于
Select
而增加,值得注意的是,
“myStr”+(i+count)
首先计算
i+count
,因为括号的优先级高于
+
我考虑过这一点,但是当仅仅使用索引产生了我认为正确的结果时,我感到非常困惑。现在我想了想,我只是没有仔细考虑在使用索引时发生了什么。愚蠢的错误。我仍然不明白它是如何返回的。。。那是问题中的错别字吗?它当然不应该忽略索引0。@Selman22好问题。那也把我甩了。答案似乎是在从VS调试器获取字符串和将其放入post之间发生了一些事情。那一定是我,因为我现在运行代码时前面的零就在那里。你能发布一个可复制的示例吗?您的第一个代码应该生成类似于
myStr_03
的输出,而不是
myStr_3
@Habib您是正确的。见下文对Selman22的答复。这个问题不是我最擅长的
"myStr_" + (i + count)
"myStr_" + 0
"myStr_" + 1
"myStr_" + 2
"myStr_" + 3
.....