2009-12-16 50 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, 
    ... 
} 
相關問題