我有一个使用OrderBy()
Linq函数排序的列表,它返回一个IOrderedEnumerable
.
var testList = myList.OrderBy(obj => obj.ParamName);
ParamName是一个可以保存整数和字符串的对象.上面的orderBy基于整数值对列表进行排序.现在我在testList上运行foreach并根据其整数值将ParamName属性更改为某个字符串,如下所示,
using (var sequenceEnum = testList.GetEnumerator()) { while (sequenceEnum.MoveNext()) { sequenceEnum.Current.ParamName = GetStringForInteger(int.Parse(Convert.ToString(sequenceEnum.Current.ParamName))); } }
接下来发生的事情是上一循环之后列表中项目的顺序已被中断,并且已根据分配的字符串而不是初始排序对列表进行排序.
但是,当我.ToList()
与该.OrderBy()
子句一起使用时,保留了顺序.
有谁能帮助我这里发生的事情?
样本输出图示:
编辑: 我们都错了你的问题.错误排序的原因是因为你正在比较"B"和"AA",并期望AA在excel之后的B之后,当然不会按字母顺序发生.
在排序之前指定显式比较器或在执行排序之前将ParamName转换为Int.
Linq通常返回IEnumerable元素的原因是它具有惰性评估行为.这意味着它将在您需要时评估结果,而不是在构建时评估结果.
调用ToList强制linq评估结果以生成预期列表.
TL; DR在执行linq查询并在获取结果之前更改源数据集时要非常小心.