使用LINQ对列表中每个对象的字段进行排序

时间:2012-09-03 01:59:59

标签: linq

是否可以使用LINQ对IEnumerable列表中的项进行排序?

例如:

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

上面给出的样本的预期输出将是List中的排序值。 预期产出是:

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

谢谢

3 个答案:

答案 0 :(得分:1)

尝试,

 sam.All(p => { p.list.Sort(); return true; });

答案 1 :(得分:0)

((List<sample>)sam).ForEach(s => s.list.Sort());

答案 2 :(得分:0)

LINQ的一般形状是它不会改变原始数据。例如,如果我们有一个列表

var ints = new  List<int>{5,6,1};

并使用linq'排序'

var sorted = ints.OrderBy();

我们最终得到两个列表

ints => { 5,6,1}
sorted => {1,5,6}

在上面的示例中,它取决于您希望输出的内容

如果您想要一个新的样本列表,其中列表已经排序,那么您可以使用

var newSampleList = samples.Select( sam => new Sample { 
                                                 id = sam.id, 
                                                 name = sam.name, 
                                                 list = new List<int>(sam.list.OrderBy())
                                   });

如果您不想创建新列表但想要对值进行排序,那么它实际上并不是LINQ的目的,但可以使用AVD的答案来执行每个成员的执行功能(在这种情况下)在列表上调用排序。)

注意:这仅在sample.list被定义为List()时才有效,因为Sort()仅存在于List&lt;&gt;上。如果定义为IList或IEnumerable,它将无效。