2009-12-16 67 views
0

我不知道这是否可能,但我如何访问已在初始化程序中设置的对象属性,以便我可以使用它在相同的初始化程序中设置另一个属性?如何访问初始化程序中设置的对象属性?

这里就是我想要做的事:

var usersWithCount = 
    users 
    .AsEnumerable() 
    .Select(
     u => 
     new User() 
      { 
       UserId = u.UserId, 
       UserName = u.UserName, 
       Email = u.Email, 
       RelatedId = u.RelatedId, 
       ReviewCount = u.Reviews.Count(r => !r.Deleted && r.Approved), 
       HelpfulYesCount = u.Reviews.Where(r => !r.Deleted && r.Approved).Sum(r => r.HelpfulYes), 
       HelpfulNoCount = u.Reviews.Where(r => !r.Deleted && r.Approved).Sum(r => r.HelpfulNo), 
       TotalPoints = ReviewCount + HelpfulYesCount - HelpfulNoCount, 
       DateCreated = u.DateCreated 
      }) 
    .OrderByDescending(user => user.TotalPoints); 

不工作的部分是 “TotalPoints = ReviewCount + HelpfulYesCount - HelpfulNoCount”。我宁愿避免再次使用“u.Reviews.Count(r =>!r.Deleted & & r.Approved)”,我不想通过循环结果来添加这些值来设置总积分。

如何在初始化程序中引用设置在TotalPoints属性上方的那些属性?有什么方法可以将它们设置为等于变量,并将它们引用到设置的位置以及我试图添加它们的位置?我是否以完全错误的方式接近这种情况?

回答

1

我相信你可以做

... 
.Select(u => { 
    var rc = u.Reviews.Count(...); 
    var hyc = ...; 
    ... 
    return new User() { /*now reference precomputed vars rc, hyc, ...*/ };}) 
... 

虽然也许有另一个/更好的办法。

+0

这完美地工作。谢谢! – upheaval 2009-12-16 22:42:33

1

为什么不更改User类的TotalPoints属性以返回计算值?例如

public int TotalPoints 
{ 
    get 
    { 
    return ReviewCount + HelpfulYesCount - HelpfulNoCount 
    } 
} 
+1

由于用户对象是即时创建的 – 2009-12-16 22:33:16

+1

好吧,但是您肯定必须为User对象的某个类定义一个类定义? – tt83 2009-12-16 22:34:19

+0

用户对象是即时创建的,但我实际上将这些属性添加到对象。我试过这个选项,它确实工作,但决定去与布赖恩的建议,因为用户对象是我添加了属性的唯一对象,我可能想这样做一个对象的属性我还没有添加自定义属性至。谢谢! – upheaval 2009-12-16 22:45:15

0

为此,您需要两个级别。 Enumerable#1来计算你的基数,Enumerable#2(你返回来巩固计数)。

1

基本上相同,Brian的答案,但在查询表达式,而不是扩展方法

from users.AsEnumerable() 
let reviewCount = u.Reviews.Count(...) 
let helpfulYesCount = u.Reviews.Count(...) 
let ... 
select new User 
{ 
    ReviewCount = reviewCount, 
    ... 
} 
相关问题