2014-10-28 45 views
1

给出一个Location的列表,我需要做2个排序步骤。如何通过两个属性订购这个简单的.NET列表?

  1. 订购LocationType上升。
  2. 对于每个位置类型值顺序,这些结果由Name升序。

的样本数据:

Location Type | Name 
      2 | Templestowe Lower 
      2 | Templestowe 
      1 | Melbourne 

预期结果:

1. Melbourne 
2. Templestowe 
3. Templestowe Lower 

Here is a (not working) .NET Fiddle ...

和这里的主代码(从小提琴复制)..

private class Location 
{ 
    public Location (string name, int locationType) 
    { 
     Name = name; 
     LocationType = locationType; 
    } 

    public string Name { get; private set; } 
    public int LocationType { get; private set;} 
} 

public static void Main() 
{ 

    var locations = new List<Location> 
    { 
     new Location("Templestowe Lower", 2), 
     new Location("Templestowe", 2), 
     new Location("Melbourne", 1) 
    }; 

    // TODO: return a list, sorted by LocationType and name. 
    var results = XXXXX; 

    foreach(var location in results) 
    { 
     Console.WriteLine(location.Name); 
    } 
} 

回答

6
locations.Sort((x,y) => { 
    int delta = x.LocationType.CompareTo(y.LocationType); 
    if(delta == 0) delta = string.Compare(x.Name, y.Name); 
    return delta; 
}); 

或者:

var results = locations.OrderBy(x => x.LocationType).ThenBy(x => x.Name); 

或者在LINQ语法(编译为同样的事情):

var results = from loc in locations 
       orderby loc.LocationType, loc.Name 
       select loc; 
+0

我想他的意思是为了通过位置类型首先,然后名称。编辑:我看到你明白了:) – 2014-10-28 11:44:08

+0

@mot确实;正在解决这个问题; p – 2014-10-28 11:44:20

+0

'ThenBy' ???这是多么令人敬畏的巫术?! *头部爆炸*。 :心:马克! – 2014-10-28 11:46:03

-1

入住此使用GROUP BY

var results = locations 
      .GroupBy(x => x.LocationType) 
      .OrderBy(x => x.Key) 
      .SelectMany(g => g.OrderBy(x=>x.Name));