OrderBy子句的问题对排序没有任何影响。我已经在调试器中完成了这个工作,并确保这是一个案例,即代码的排序行被命中,并且在订单之后查看结果尚未应用。
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;
}
答案 0 :(得分:9)
OrderBy
返回将执行排序的查询:它不会修改原始列表(而List<T>.Sort
之类的内容会修改原始列表
而是尝试类似:
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText).ToList();
编辑:您可能想要使用ddlOptions
的类型或者返回数据的位置/方式,因为我们正在做一个额外的ToList
而不是必要的,但这可能是次要/无论如何,这个案子都没有问题。
答案 1 :(得分:6)
尝试:
if (sort)
{
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); <===== Should work now.
}
答案 2 :(得分:3)
正如其他人所说,你需要将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;
}
调用:
ToList
请注意,此版本的方法将使用延迟执行,因此在迭代序列之前不会实际执行Select / OrderBy。如果您不想这样做,可以在return
行添加{{1}}。
答案 3 :(得分:1)
您需要输入:
ddlOptions = ddlOptions.OrderBy(l => l.DisplayText);
答案 4 :(得分:0)
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
。