c#list.OrderBy根本不工作?

时间:2015-12-06 11:00:02

标签: c#

我很难理解list.OrderBy是如何工作的,我不明白我做错了什么......我觉得这很容易让我在某个地方犯了一些愚蠢的错误,或者它只是在工作另一种方式比我理解。无论如何,我想要做的是从属性中排序一个列表,我做了一个简单的程序来说明我的意思。

class Hero
    {
        public int level;
        public Hero(int level)
        {
            this.level = level;
        }

        static void Main(string[] args)
        {
            Hero hero1 = new Hero(1);
            Hero hero3 = new Hero(3);
            Hero hero2 = new Hero(2);

            List<Hero> list = new List<Hero>();
            list.Add(hero1);
            list.Add(hero3);
            list.Add(hero2);
            list.OrderBy(x => x.level).ToList();
            foreach (Hero x in list)
            {
                Console.WriteLine(x.level);
            }
        }
    }

这给出了输出:

1
3
2 

虽然我想要输出:

1
2
3

有人可以向我解释为什么它没有这样做以及我如何解决它?我对c#很新。

4 个答案:

答案 0 :(得分:18)

只是需要指定OrderBy返回的内容。

list = list.OrderBy(x => x.level).ToList();

答案 1 :(得分:1)

您应该将list.OrderBy(x => x.level)的结果返回到同一列表:

list = list.OrderBy(x => x.level).ToList();

答案 2 :(得分:1)

OrderBy()不会对您输入的IEnumerable进行排序,但会返回新的IOrderedEnumerable

这将有效:

List<Hero> ordered = list.OrderBy(x => x.level).ToList();
foreach (Hero x in ordered)
{
    Console.WriteLine(x.level);
}

甚至

foreach (Hero x in list.OrderBy(x => x.level))
{
    Console.WriteLine(x.level);
}

答案 3 :(得分:0)

OrderBy()会返回有序列表,并且不会将结果显示在列表中,因此您应该将结果分配给当前列表:

list = list.OrderBy(x => x.level).ToList();

或者如果您不想保存,可以在foreach

中执行此操作
foreach (Hero x in list.OrderBy(x => x.level))

然后list在订购之前仍然包含默认值。