【发布时间】:2017-01-19 09:20:40
【问题描述】:
我有一个使用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() 子句结合使用时,会保留顺序。
谁能帮我看看这里发生了什么?
示例输出说明:
【问题讨论】:
-
如果您包含了填充 myList 的实际数据,将会有所帮助。这很容易包含在您的问题中吗?
-
您的 testList 不是一个列表,而是一个 LINQ 查询。如果要保留此查询,请使用
ToList或ToArray。在此之前,它使用延迟执行,这意味着您将始终使用当前条件评估此查询。 -
@NickAllan 排序通常是 Excel 中存在的列,例如 A、B、C、D...AA、AB.. 等等。上面的代码实际上将其转换为数字,对其排序并转换为字符串。
-
我很好奇这个。虽然您从
OrderBy获得的排序被推迟,但排序发生在第一次调用MoveNext()之后,所以我不希望这样。你能包括一个最小的完整复制吗?
标签: c# linq ienumerable iorderedenumerable