Как я могу получить доступ к свойству объекта, установленному в инициализаторе? - PullRequest
0 голосов
/ 17 декабря 2009

Я не знаю, возможно ли это вообще, но как я могу получить доступ к свойству объекта, которое было установлено в инициализаторе, чтобы я мог использовать его для установки другого свойства в том же инициализаторе?

Вот что я пытаюсь сделать:

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? Есть ли способ, которым я могу установить их равными переменным и ссылаться на них, где они установлены и где я пытаюсь добавить их? Я подхожу к этой ситуации совершенно неправильно?

Ответы [ 4 ]

1 голос
/ 17 декабря 2009

В основном так же, как ответ Брайана, но в выражении запроса вместо методов расширения

from users.AsEnumerable()
let reviewCount = u.Reviews.Count(...)
let helpfulYesCount = u.Reviews.Count(...)
let ...
select new User
{
   ReviewCount = reviewCount,
   ...
}
1 голос
/ 17 декабря 2009

Почему бы вам не изменить свойство TotalPoints вашего класса User, чтобы оно возвращало вычисленное значение? например,

public int TotalPoints
{
  get
  {
    return ReviewCount + HelpfulYesCount - HelpfulNoCount
  }
}
1 голос
/ 17 декабря 2009

Полагаю, вы могли бы сделать

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

хотя, возможно, есть другой / лучший способ.

0 голосов
/ 17 декабря 2009

Для этого вам нужны два уровня. Enumerable # 1 для подсчета базовых значений, Enumerable # 2 (то, что вы возвращаете для объединения значений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...