为什么 LINQ 将其索引视为字符串
本文关键字:字符串 索引 LINQ 为什么 | 更新日期: 2023-09-27 18:34:27
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"。奇怪。
以下代码(注意额外的参数(返回正确的结果; 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 说:
虽然索引类型选择器的第二个参数表示从零开始的索引 源序列中的该元素。
没有拼写出来,但对我来说,这和"索引"这个词意味着一种数字类型。
为什么 LINQ 将两个整数加起来,就好像它们是字符串一样?
为什么 LINQ 将两个整数加起来,就好像它们是字符串一样?
它不是 LINQ,而是字符串连接,如果你有一个没有任何()
的string + int + int
,所有操作数都将被视为string
ToString
因为每个操作数都会调用方法。
这:
"myStr_" + i + count
变成这样的东西:
string.Concat("myStr_",i,count);
内部调用,ToString
每个参数。
但是当你有这样的代码时:
"myStr_" + (i + count)
然后由于括号具有更高的优先级,+
运算符。 对i
和count
执行整数算术,然后将它们的结果连接在字符串中。
作为旁注,Dictionary
不是有序集合,因此您不能确保每次都获得相同的顺序。
请参阅: 字典 C#
出于枚举的目的,字典中的每个项目都被视为 表示值及其的键值对结构 .key。项的返回顺序未定义。
编辑:您的评论:
我考虑过这一点,但是: .选择((d, i( => "myStr_" + i(;(不是免费的 变量计数(执行加法,而不是字符串连接。
它仍然是字符串连接。您看到由于Select
而更改了i
值。在每个枚举中,i
的值是元素的索引,因此您会得到类似以下内容:
"myStr_" + 0
"myStr_" + 1
"myStr_" + 2
"myStr_" + 3
.....
同样,对于同一元素,此值 i
可能会更改,因为字典不是有序集合。
请参阅提供索引Enumerable.Select
重载。
选择器的第二个参数表示从零开始的索引 源序列中的该元素。如果 元素按已知顺序排列,并且您想使用 元素,