2010-12-08 54 views
5

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

例如名称的列表:

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

会进行排序:

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

如何通过“多个属性在同一时间”排序不同于排序一个属性,然后由另一个属性? – LBushkin 2010-12-08 17:28:38

+1

这听起来像OP想按两个属性的最早排序值进行排序。 – cdhowie 2010-12-08 17:30:21

回答

6

这是一个奇怪的一个希望。

你可以通过任何Func键< TSource,TKEY的>你喜欢到排序依据: -

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)的逻辑将澄清目的。

3

什么:

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