当前位置:  开发笔记 > 编程语言 > 正文

OrderBy Linq的奇怪行为

如何解决《OrderByLinq的奇怪行为》经验,为你挑选了1个好方法。

我有一个使用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()子句一起使用时,保留了顺序.

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

样本输出图示:

在此输入图像描述



1> Bruno Belmon..:

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

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


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

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

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

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有