[英]Linq OrderBy does not sort a List<T>. How do I sort the list?
OrderBy 子句的问题对排序没有任何影响。 我已经在调试器中完成了这个过程,并确保这是一个代码的排序行被命中的情况,并在未应用 order by 之后查看结果。
public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>(
IEnumerable<TClass> list,
Func<TClass, TValueType> value,
Func<TClass, string> displayText,
bool sort = true
)
{
List<DDLOptions<TValueType>> ddlOptions;
ddlOptions = list.Select(
l => new DDLOptions<TValueType>
{
Value = value(l),
DisplayText = displayText(l)
}
).ToList(); <========== Works if I put the Order By here.
if (sort)
{
ddlOptions.OrderBy(l => l.DisplayText); <===== Does NOT work here.
}
return ddlOptions;
}
OrderBy
返回一个执行排序的查询:它不会修改原始列表(而像List<T>.Sort
这样的东西会修改原始列表)
而是试着像:
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText).ToList();
编辑:您可能想要使用ddlOptions
的类型或者返回数据的位置/方式,因为我们正在做一个额外的ToList
不是必要的,但这对于这种情况来说可能是一个小问题/非问题。
尝试:
if (sort)
{
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); <===== Should work now.
}
正如其他人所说,你需要将OrderBy
的结果分配给某个东西,因为它不会改变它所作用的序列。 最简单的方法是使ddlOptions
成为IEnumerable
而不是List
,这样就可以将结果分配给它了。 也不需要选择上的ToList
调用:
public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>(
IEnumerable<TClass> list,
Func<TClass, TValueType> value,
Func<TClass, string> displayText,
bool sort = true
)
{
IEnumerable<DDLOptions<TValueType>> ddlOptions;
ddlOptions = list.Select(
l => new DDLOptions<TValueType>
{
Value = value(l),
DisplayText = displayText(l)
}
);
if (sort)
{
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText);
}
return ddlOptions;
}
请注意,此版本的方法将使用延迟执行,因此在迭代序列之前不会实际执行Select / OrderBy。 如果您不想这样做,可以在return
行上添加ToList
。
你需要输入:
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText);
OrderBy
不对List<T>
或任何其他IEnumerable<T>
排序。 它生成一个新的,有序的IEnumerable<T>
。 所以调用ddlOptions.OrderBy(...)
不会修改ddlOptions
。
如果你有一个List<T>
并希望对它进行排序,你可以使用Sort
方法 - 特别是将Comparison<T>
作为参数的重载。 这实际上是对列表进行排序,而不是返回新的IEnumerable
。
Comparison<T>
是一个代表一个函数的委托,它取两个T
并且如果第一个比第二个“少”则返回一个负数,如果第一个比第二个“更大”则返回一个正数,如果一个不是,则返回零在另一个之前或之后排序。
在这种情况下,您不必记住这一点。 相反,你可以这样做:
ddlOptions.Sort((x, y) => string.CompareOrdinal(x.DisplayText, y.DisplayText));
您传入一个函数,该函数在列表中包含两个项目并返回其DisplayText
属性的比较结果,这些属性将为负数,0或正数。
有时我们使用OrderBy
因为它不会修改原始列表。 但是,如果修改列表是我们想要的,然后我们就可以使用Sort
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.