Linq OrderBy任何财产

时间:2010-12-08 17:25:25

标签: c# linq .net-4.0 sql-order-by

我知道如何通过一个属性订购,然后是另一个属性。我想知道是否有任何属性的linq方式(或同时多个属性)。

例如名单列表:

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

将被排序:

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

2 个答案:

答案 0 :(得分: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)的逻辑可以澄清目的。

答案 1 :(得分:3)

怎么样:

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