LINQ按任意属性排序

5

我知道如何按一个属性排序,然后按另一个属性排序。我想知道是否有一种linq方法可以按任何属性(或同时按多个属性)排序。

例如,一个名称列表:

   ->Adam     Jones
   ->Dude     Lebowski
   ->Zander   Berry

将被排序:

   ->Adam     Jones
     Zander ->Berry
   ->Dude     Lebowski

1
按“多个属性同时排序”与先按一个属性再按另一个属性排序有何不同? - LBushkin
1
听起来像是OP想按两个属性中最早排序的值进行排序。 - cdhowie
1
你如何对 Adam JonesJones Adam 进行排序?按照什么顺序? - Saeed Amiri
@LBushkin - 当第一个OrderBy有多行具有相同值时,才会发生ThenBy - Josiah Ruddell
2个回答

6

这是一个比较奇怪的需求。

你可以将任何Func<TSource, TKey>传递给OrderBy:

names.OrderBy(x => x.FirstName.CompareTo(x.LastName) < 0
                     ? x.FirstName
                     : x.LastName);

如果您认为内联三元式看起来很丑(或者需要在各个地方重复使用该排序),您可以编写自己的 IComparer:- http://msdn.microsoft.com/en-us/library/bb549422.aspx
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

3

你觉得呢:

.OrderBy(obj => (obj.PropA < obj.PropB) ? obj.PropA : obj.PropB)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接