我有以下型号
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?
答案 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表达式是惰性求值的,因此您不会捕获结果从而强制它解析,所以此语句无效。