2012-02-06 139 views
2

列表我有以下型号排序与排序依据

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); 

它编译,但名单犯规得到排序。怎么来的?

+0

如何知道该列表是**不是**排序? – Tigran 2012-02-06 12:33:23

回答

4

LINQ是免费的副作用设计,所以它不会改变输入。它也使用延迟执行,直到尝试访问数据时才会执行任何操作。重新分配输出到列表,它应该工作。请注意,我在这里使用ToList()方法,因为OrderBy()返回IEnumerable<UserViewModel>,直到我们尝试获取其中的项目才会对其进行评估。我们使用ToList()方法从这个序列创建一个新列表并强制查询执行。

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

我会说“由*设计*免费副作用”。 – 2012-02-06 12:38:45

+0

@PeterWone谢谢。 – 2012-02-06 12:39:48

1

你可以尝试

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

LINQ查询懒洋洋地执行,这意味着它们不执行,直到源对象是列举。而且,查询从不在实际对象上运行,而是返回一个新实例。

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

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

+1喜欢懒洋洋的。 – 2012-02-06 12:39:05

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

这是一种表达,不修改的东西的指令。表达式的值是你的排序列表,但你并没有将它捕获到一个变量中,而且LINQ表达式是懒惰评估的,所以因为你没有捕获结果而迫使它解决,所以这个语句没有任何影响。

2

在这个userviewmodel.OrderBy(x => x.ProcentAnswered);你刚才查询准备,你甚至没有排序列表

在这个userviewmodel.OrderBy(x => x.ProcentAnswered).ToList();你有解雇查询,并已整理列表,但是上面的表达式将会给您耳目一新的列表

所以,你需要做到这一点

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

受到大家的建议。

希望这对你有用。