Встроенные операции при создании нового динамического объекта - PullRequest
2 голосов
/ 23 ноября 2010

Я пытаюсь предоставить DataGridview (winform) запрос с одним оператором в LINQ.В следующей строке присваивается сумма значений записей элементу Долг или Кредит в зависимости от суммы.

транзакция 1 --- * запись

var transactions = from t in this.account.transactions select new { 
                Debt = t.records.Sum(x=>x.value) < 0 ? t.records.Sum(x=>x.value).ToString() : String.Empty,
                Credit = t.records.Sum(x => x.value) > 0 ? t.records.Sum(x => x.value).ToString() : String.Empty
            };

Но я сталкиваюсь с двумя проблемами,их можно довольно легко решить, но я ищу что-то чистое и эффективное.

  1. Как предотвратить вызов метода Sum столько раз?Любая идея для повторного факторинга и уменьшения количества вызовов?

  2. Я хотел бы добавить нового члена с именем Баланс, который в основном суммирует предыдущую сумму баланса (в предыдущей итерации) стекущий.Возможно ли (и чисто) сделать это прямо в новом утверждении?используя делегата?

С уважением

1 Ответ

2 голосов
/ 23 ноября 2010

Что касается вашего первого вопроса, вот как вы могли бы это сделать:

var transactions = from t in this.account.transactions
                    let sum = t.records.Sum(x => x.value)
                    select new
                    {
                        Debt = sum < 0 ? sum.ToString() : String.Empty,
                        Credit = sum > 0 ? sum.ToString() : String.Empty
                    }; 

Что касается вашего второго вопроса, я бы действительно заинтересовался чистым решением.Похоже, что LINQ не предназначен для работы ни с чем, кроме одной записи.Вы могли бы сделать

double balance = 0;
var transactions = from t in this.account.transactions
                    let sum = t.records.Sum(x => x.value)
                    let newBalance = balance += sum
                    select new
                    {
                        Debt = sum < 0 ? sum.ToString() : String.Empty,
                        Credit = sum > 0 ? sum.ToString() : String.Empty,
                        Balance = newBalance.ToString()
                    }; 

, но я бы не назвал это "чистым".=)

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