Вычисление промежуточного итога с использованием LINQ to SQL - PullRequest
2 голосов
/ 16 октября 2011

У меня есть приложение WPF C #, которое обращается к данным через соединение SQL-LINQ и помещает их в сетку данных.Я добавил столбец Running Pips и пытался выяснить, как правильно заполнить этот столбец.Я нашел несколько методов поиска в Интернете, но ни один из них не подходит для моей конкретной настройки.Большую часть времени я оказываюсь в бесконечной петле.Мне бы хотелось, чтобы столбец «Пропускные пункты» был кумулятивным, а порядок вычислений начинался с самого раннего «времени закрытия».

Close Time   Profit    Running Profit
 10.09.11     $10          $10 
 10.10.11     $20          $30 
 10.11.11     $15          $45 

Вот краткое изложение кода.Я надеюсь, что кто-то может предложить, как исправить этот код с любой соответствующей информацией, необходимой, чтобы помочь мне в реализации этого:

public void RefreshClose() {
    if (CloseTradeCollection == null) return;
    var i = 0;

    if (StaticTool.SelectedAccount == null) {
        ExistCloseTrade = false;
        CloseTradeCollection.Clear();
        return;
    }

    Account = StaticTool.SelectedAccount;

    foreach (var trade in GetClosedTradesFromDb()) {
        if (CloseTradeCollection.Count <= i) {
            ExistCloseTrade = true;
            var tradeDetails = new Trade {
                Id = trade.id,
                Ticket = trade.ticket,
                OpenTime = trade.opentime,
                CloseTime = trade.closetime,
                Symbol = trade.symbol,
                OpenPrice = trade.openprice,
                ClosePrice = trade.closeprice,
                Profit = trade.profit,
                Comment = trade.comment.Trim(),
            };

            tradeDetails.History = tradeDetails.CloseTime - tradeDetails.OpenTime;
            CloseTradeCollection.Add(tradeDetails);
        }

        else {
            var tradeDetails = CloseTradeCollection[i];
            tradeDetails.Id = trade.id;
            tradeDetails.Ticket = trade.ticket;
            tradeDetails.OpenTime = trade.opentime;
            tradeDetails.CloseTime = trade.closetime;
            tradeDetails.Symbol = trade.symbol;
            tradeDetails.OpenPrice = trade.openprice;
            tradeDetails.ClosePrice = trade.closeprice;
            tradeDetails.Profit = trade.profit;
            tradeDetails.Comment = trade.comment.Trim();
            tradeDetails.History = DateTime.Now - tradeDetails.OpenTime;

            //tradeDetails.RunningProfit = ????????

        }

        i++;
    }
}

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Вы можете создать локальную переменную для отслеживания текущей прибыли, используя тот факт, что операция присваивания возвращает присваиваемое значение.

tradeDetails.RunningProfit = (runningProfit = runningProfit + trade.profit);
0 голосов
/ 16 октября 2011

Вот общая идея - вы должны быть в состоянии приспособить ее к вашим потребностям:

class Trade {
    public DateTime CloseTime { get; set; }
    public decimal Profit { get; set; }
}

class TradeWithRunningProfit : Trade {
    public decimal RunningProfit { get; set; }
}

class Program {

    static IEnumerable<TradeWithRunningProfit> GetRunningProfits(IEnumerable<Trade> rows) {

        decimal running_profit = 0;

        return
            from row in rows
            select new TradeWithRunningProfit {
                CloseTime = row.CloseTime,
                Profit = row.Profit,
                RunningProfit = (running_profit += row.Profit)
            };

    }

    static void Main(string[] args) {

        var rows = new[] {
            new Trade { CloseTime = new DateTime(11,10,09), Profit = 10},
            new Trade { CloseTime = new DateTime(11,10,10), Profit = 20},
            new Trade { CloseTime = new DateTime(11,10,11), Profit = 15},
        };

        foreach (var row_with_running_profit in GetRunningProfits(rows)) {
            Console.WriteLine(
                "{0}\t{1}\t{2}",
                row_with_running_profit.CloseTime,
                row_with_running_profit.Profit,
                row_with_running_profit.RunningProfit
            );
        }

    }

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