我知道如何按一个属性排序,然后按另一个属性排序。我想知道是否有一种linq方法可以按任何属性(或同时按多个属性)排序。
例如,一个名称列表:
->Adam Jones
->Dude Lebowski
->Zander Berry
将被排序:
->Adam Jones
Zander ->Berry
->Dude Lebowski
我知道如何按一个属性排序,然后按另一个属性排序。我想知道是否有一种linq方法可以按任何属性(或同时按多个属性)排序。
例如,一个名称列表:
->Adam Jones
->Dude Lebowski
->Zander Berry
将被排序:
->Adam Jones
Zander ->Berry
->Dude Lebowski
这是一个比较奇怪的需求。
你可以将任何Func<TSource, TKey>传递给OrderBy:
names.OrderBy(x => x.FirstName.CompareTo(x.LastName) < 0
? x.FirstName
: x.LastName);
class PersonFirstOrLastNameComparer : IComparer<Person>
{
public int Compare( Person x, Person y )
{
return GetKey( x ).CompareTo( GetKey( y ) );
}
private String GetKey( Person person )
{
if ( person.FirstName.CompareTo( person.LastName ) < 0 )
{
return person.FirstName;
}
else
{
return person.LastName;
}
}
}
并且:-
names.OrderBy(x => x, new PersonFirstOrLastNameComparer());
但我建议不要这样做。如果您发现自己需要按照模型类的两个属性之一进行排序,我怀疑您的模型类可能无法胜任此任务。
如果没有更多关于您特定应用程序的信息,我无法提供更多建议,但我可能会建议将该逻辑封装在模型类内部(通过提供特定属性,例如Person.SortKey,或者如果是通用排序,则通过覆盖CompareTo),或创建视图模型。在代码审查中,我发布的代码片段可能会引起一些疑虑。我认为将逻辑与模型(或ViewModel)保持一致将有助于澄清其目的。
sort
函数的.OrderBy((x, y) => /**/)
,但是这个方法就可以了。 - Josiah Ruddell你觉得呢:
.OrderBy(obj => (obj.PropA < obj.PropB) ? obj.PropA : obj.PropB)
Adam Jones
和Jones Adam
进行排序?按照什么顺序? - Saeed AmiriThenBy
。 - Josiah Ruddell