OrderBy Linq的奇怪行为

Kri*_*P S 2 c# linq ienumerable iorderedenumerable

我有一个使用OrderBy()Linq函数排序的列表,它返回一个IOrderedEnumerable.

var testList = myList.OrderBy(obj => obj.ParamName);
Run Code Online (Sandbox Code Playgroud)

ParamName是一个可以保存整数和字符串的对象.上面的orderBy基于整数值对列表进行排序.现在我在testList上运行foreach并根据其整数值将ParamName属性更改为某个字符串,如下所示,

using (var sequenceEnum = testList.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        sequenceEnum.Current.ParamName = GetStringForInteger(int.Parse(Convert.ToString(sequenceEnum.Current.ParamName)));
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来发生的事情是上一循环之后列表中项目的顺序已被中断,并且已根据分配的字符串而不是初始排序对列表进行排序.

但是,当我.ToList()与该.OrderBy()子句一起使用时,保留了顺序.

有谁能帮助我这里发生的事情?

样本输出图示:

在此输入图像描述

Bru*_*ndo 8

编辑: 我们都错了你的问题.错误排序的原因是因为你正在比较"B"和"AA",并期望AA在excel之后的B之后,当然不会按字母顺序发生.

在排序之前指定显式比较器或在执行排序之前将ParamName转换为Int.


Linq通常返回IEnumerable元素的原因是它具有惰性评估行为.这意味着它将在您需要时评估结果,而不是在构建时评估结果.

调用ToList强制linq评估结果以生成预期列表.

TL; DR在执行linq查询并在获取结果之前更改源数据集时要非常小心.