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

本文关键字:字符串 索引 LINQ 为什么 | 更新日期: 2023-09-27 18:34:27

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"。奇怪。

以下代码(注意额外的参数(返回正确的结果; 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 说:

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

虽然索引类型

没有拼写出来,但对我来说,这和"索引"这个词意味着一种数字类型。

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

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

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

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

这:

"myStr_" + i + count

变成这样的东西:

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

内部调用,ToString每个参数。

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

"myStr_" + (i + count)

然后由于括号具有更高的优先级,+运算符。 对icount执行整数算术,然后将它们的结果连接在字符串中。

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

请参阅: 字典 C#

出于枚举的目的,字典中的每个项目都被视为 表示值及其的键值对结构 .key。项的返回顺序未定义。

编辑:您的评论:

我考虑过这一点,但是: .选择((d, i( => "myStr_" + i(;(不是免费的 变量计数(执行加法,而不是字符串连接。

它仍然是字符串连接。您看到由于Select而更改了i值。在每个枚举中,i 的值是元素的索引,因此您会得到类似以下内容:

"myStr_" + 0
"myStr_" + 1
"myStr_" + 2
"myStr_" + 3
.....

同样,对于同一元素,此值 i 可能会更改,因为字典不是有序集合。

请参阅提供索引Enumerable.Select重载。

选择器的第二个参数表示从零开始的索引 源序列中的该元素。如果 元素按已知顺序排列,并且您想使用 元素,