我不知道这是否可能,但是如何访问已在初始化程序中设置的对象属性,以便我可以使用它在同一初始化程序中设置另一个属性?
这是我正在尝试做的事情:
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。
如何在初始值设定项中引用在TotalPoints属性上方设置的属性?有没有什么方法可以将它们设置为等于变量并在它们设置的地方引用它们以及我在哪里添加它们?我是以完全错误的方式接近这种情况吗?
答案 0 :(得分:1)
我认为你可以做到
...
.Select( u => {
var rc = u.Reviews.Count(...);
var hyc = ...;
...
return new User() { /*now reference precomputed vars rc, hyc, ...*/ };})
...
虽然也许还有另一种/更好的方法。
答案 1 :(得分:1)
为什么不更改User类的TotalPoints属性以返回计算值? e.g。
public int TotalPoints
{
get
{
return ReviewCount + HelpfulYesCount - HelpfulNoCount
}
}
答案 2 :(得分:1)
基本上与Brian的答案相同,但在查询表达式而不是扩展方法
from users.AsEnumerable()
let reviewCount = u.Reviews.Count(...)
let helpfulYesCount = u.Reviews.Count(...)
let ...
select new User
{
ReviewCount = reviewCount,
...
}
答案 3 :(得分:0)
你需要两个级别。可枚举#1来计算您的基数,可枚举#2(您返回以合并计数)。