2015-06-16 33 views
0

我想通过第一个列表中的“SortKey”第一个列表和第二个列表进行排序,但我无法做到这一点。请给我你的建议如何使用LINQ订购清单。如何在C#中使用LINQ列表内部列表进行排序

//Get Data and put in myList 
List<Group1> myList = GetData(); 

//Sort 
//Visual studio do not get compilation error but this code doesn't working at the run-time. 
var SortedData = myList.Select(x => x).OrderBy(x=> x.SortKey).ThenBy(y=> y.Group2.OrderBy(x=> x.SortKey)).ToList(); 

型号:

public class Group1 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int Sortkey {get;set;} 
    public List<Group2> {get;set;} 
} 
public class Group2 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int Sortkey {get;set;} 
} 
+0

此代码编译? '公开列表 {get; set;}' – Jens

+0

@Jens是这个“公开列表 {get; set;}”编译。我只需要列表里面的Order列表,Models和Code只是视觉方式来解释情况。 –

+0

@Tim我已将“类别”更改为Group2 –

回答

0

我测试此代码,一切运作良好。

var result = MyList.OrderBy(x => x.SortKey).ToList(); 
       foreach (var item in model) 
       { 
        item.Group2 = item.Categories.OrderBy(x => x.SortKey).ToList(); 
       } 
+0

所以这基本上是[我的答案](http://stackoverflow.com/a/30869271/284240)的第二个aproach。如果是这样,你应该考虑接受它;) –

+0

@Tim Schmelter是啊:) –

0

不能重新以便与LINQ查询innerlist。唯一的办法是创建一个新的有序列表。我建议使用一个简单的循环和List.Sort

List<Group1> myList = GetData(); 
myList.Sort((x1, x2) => x2.SortKey.CompareTo(x2.SortKey)); 
foreach(Group1 item in myList) 
{ 
    item.Group2.Sort((x1, x2) => x2.SortKey.CompareTo(x2.SortKey)); 
} 

如果你想使用LINQ(List.Sort是更有效):

List<Group1> myList = GetData().OrderBy(x => x.SortKey).ToList(); 
foreach(Group1 item in myList) 
{ 
    item.Group2 = item.Group2.OrderBy(x => x.SortKey).ToList(); 
} 

但是,为什么你不能命令列出GetData

+0

也许可以在“一行”中完成。你对我的回答有什么看法?很高兴听到您的意见 – Jens

+0

@JensHorstmann:LINQ **查询**不应该有副作用。一个修改集合的'OrderBy'显然是一个副作用;) –

+0

好吧。确实如此。好点子。 – Jens

0

我不擅长与LINQ和我没有测试过这种解决方案 但对于这一点:

提示:这种解决方案可能不太好,因为它有副作用(见对方的回答评论)

假设你有这些类:

public class Group1 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int Sortkey {get;set;} 
    public List<Group2> Categories {get;set;} 
} 

public class Group2 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int Sortkey {get;set;} 
} 

// Order first List with the first OrderBy 
var sortedList = myList.OrderBy(
    x => 
     { 
      // x equals a element in the list 
      // foreach x you want to sort the second list 
      // and assign it back to x.Categories 
      x.Categories = x.Categories.OrderBy(y => y.Sortkey).ToList(); 
      return x.Sortkey; 
     }).ToList(); 
+0

亲爱的Jens Horstmann,你不能在linq中使用return x.Sortkey。你可以在Microsoft开发人员的网站上查看它,但这种方式并不坏:) –

+0

噢好吧:'D但它认为这将compire ..,我假设x => x.SomeThing是一个Lamda表达式,所以我可以使用这lamda作出一个代表与返回 – Jens