2012-09-03 42 views
4

如何對給定示例進行排序。在LINQ中排序IEnumerable

 IEnumerable<extra> eList = new List<extra>() 
     { 
      new extra{ id = 1, text = "a"}, 
      new extra{ id = 2, text = "g"}, 
      new extra{ id = 3, text = "i"}, 
      new extra{ id = 4, text = "e"}, 
      new extra{ id = 5, text = "f"}, 
      new extra{ id = 6, text = "d"}, 
      new extra{ id = 7, text = "c"}, 
      new extra{ id = 8, text = "h"}, 
      new extra{ id = 9, text = "b"} 
     }; 

     IEnumerable<sample> sam = new List<sample>() 
     { 
      new sample{ id = 1, name = "sample 1", list = new List<int>{1,5,6}}, 
      new sample{ id = 2, name = "sample 1", list = new List<int>{2,9}}, 
      new sample{ id = 3, name = "sample 1", list = new List<int>{8,3,7}}, 
      new sample{ id = 4, name = "sample 1", list = new List<int>{3,4,8}}, 
      new sample{ id = 5, name = "sample 1", list = new List<int>{1,5,7}}, 
      new sample{ id = 6, name = "sample 1", list = new List<int>{6,9,7}} 
     }; 

我有這樣的代碼進行排序,並加入樣本列表上面多餘的對象。

  var s2 = (from d1 in sam 
        select new 
        { 
         name = d1.name, 
         id = d1.id, 
         list = 
         (
         from d2 in d1.list 
         join e in eList on d2 equals e.id 
         select new { 
          id = d2, text = e.text 
         } 
        ).OrderBy(item => item.text.FirstOrDefault()) 
        }); 

上面的代碼工作正常,它加入了兩個數據並對列表的值進行排序。但是我想要的是上面的's2'輸出將被'list.text'的'list'值重新排序。上述

所以可能的輸出必須是:

 { id = 1, name = "sample 1", list = {'a','f','d'}},   
     { id = 5, name = "sample 1", list = {'a','f','c'}}, 
     { id = 2, name = "sample 1", list = {'g','b'}}, 
     { id = 4, name = "sample 1", list = {'i','e','h'}}, 
     { id = 6, name = "sample 1", list = {'d','b','c'}}, 
     { id = 3, name = "sample 1", list = {'h','i','c'}}, 

這是可能的LINQ?

感謝

回答

2
var newsam = sam.Select(s => new 
       { 
        id = s.id, 
        name = s.name, 
        list = s.list 
          .Select(l => eList.FirstOrDefault(e => e.id == l).text) 
          .OrderBy(e => e) 
          .ToList() 
       } 
       ).OrderBy(s => s.list.FirstOrDefault()) 
       .ToList(); 

編輯

因此,內部列表由ELIST的文本值排序;和外列表由內部列表的第一個元素

EDIT排序

  var s2=(from d1 in sam 
        select new 
        { 
         name = d1.name, 
         id = d1.id, 
         list = 
         (
         from d2 in d1.list 
         join e in eList on d2 equals e.id 
         select e.text 
        ).OrderBy(item => item).ToList() 
        }).OrderBy(item => item.list.FirstOrDefault());