使用OrderBy对列表进行排序

时间:2012-02-06 12:29:33

标签: c# linq

我有以下型号

public class UserViewModel
    {
        public String CVR_Nummer { get; set; }
        public DateTime LastActivityDate { get; set; }
        public DateTime CreationDate { get; set; }
        public String FirmaNavn { get; set; }
        public int ProcentAnswered { get; set; }
    }

我创建了一个List<UserViewModel>并尝试对其进行排序:

userviewmodel.OrderBy(x => x.ProcentAnswered);

它编译,但列表没有排序。 Howcome?

5 个答案:

答案 0 :(得分:4)

LINQ在设计上是无副作用的,所以它不会改变输入。它也使用延迟执行,在你尝试访问数据之前它不会做任何事情。将输出重新分配给列表,它应该工作。请注意我在这里使用ToList()方法,因为OrderBy()返回IEnumerable<UserViewModel>并且在我们尝试获取其中的项之前不会对其进行求值。我们使用ToList()方法从此序列创建一个新列表,并强制执行查询。

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList();

答案 1 :(得分:3)

Linq查询是懒惰执行的,这意味着在源对象枚举之前它们不会执行。此外,查询从不对实际对象进行操作,而是返回一个新实例。

要强制执行,必须在创建查询后显式调用.ToList()

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 

答案 2 :(得分:2)

在此userviewmodel.OrderBy(x => x.ProcentAnswered);中您只是准备了查询,您甚至没有对您的列表进行排序

在此userviewmodel.OrderBy(x => x.ProcentAnswered).ToList();中您有触发了查询,并且已排序列表,但上面的表达式会为您提供一个新的列表

所以你需要这样做

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 

正如大家所建议的那样。

希望这适合你。

答案 3 :(得分:1)

你可以尝试

userviewmodel = userviewmodel.OrderBy(x => x.ProcentAnswered).ToList(); 

答案 4 :(得分:1)

userviewmodel.OrderBy(x => x.ProcentAnswered); 

这是一个表达,而不是修改某些内容的指令。表达式的值是您的排序列表,但您没有在变量中捕获它,并且LINQ表达式是惰性求值的,因此您不会捕获结果从而强制它解析,所以此语句无效。

相关问题