0

私のプロジェクトには次の方法があります。

public double CalculateDailyProjectMaxPumpSpm(DateTime date, string start = null, string end = null)
{
    Log("Calculating Daily Pump stroke Max...");

    var spm = new List<double>();

    if (start == null)
    {
        for (var i = 0; i < _pumpOneSpm.Count; i++)
        {
            if (_date[i].Equals(date))
            {
                spm.Add(_pumpOneSpm[i]);
                spm.Add(_pumpTwoSpm[i]);
            }
        }
    }
    else
    {
        for (var i = 0; i < _pumpOneSpm.Count; i++)
        {
            if (_date[i].Equals(date) && 
                DateTime.Compare(_time[i], DateTime.Parse(start)) > 0 && 
                DateTime.Compare(_time[i], DateTime.Parse(end)) < 0)
            {
                spm.Add(_pumpOneSpm[i]);
                spm.Add(_pumpTwoSpm[i]);
            }
        }
    }

    return _dailyProjectMaxSpm = Math.Round(spm.Max(), 2, MidpointRounding.AwayFromZero);
}

私はメソッドが少し扱いに​​くいように見えるようにしようとしています。私が試した:

public double CalculateDailyProjectMaxPumpSpm(DateTime date, string start = null, string end = null)
{
    Log("Calculating Daily Pump stroke Max...");

    var spm = start == null ? _pumpOneSpm.Concat(_pumpTwoSpm).Where((t, i) => _date[i].Equals(date)).ToList()
                            : _pumpOneSpm.Concat(_pumpTwoSpm).Where((t, i) => _date[i].Equals(date) && 
                                                                              DateTime.Compare(_time[i], DateTime.Parse(start)) > 0 && 
                                                                              DateTime.Compare(_time[i], DateTime.Parse(end)) < 0).ToList();

    _dailyProjectMaxSpm = Math.Round(spm.Max(), 2, MidpointRounding.AwayFromZero);

    return _dailyProjectMaxSpm;
}

しかし、プログラムを実行するとIndex out of range. Must be non-negative and less than the size of the collection. Parameter name: indexエラーが発生しました。さて、条件が満たされている限り、要素が新しいリストに追加される順序は気にしませんでした。誰かがエラーで私を助けてくれますか? ありがとう。

アップデート

_dateはデータベースから取得した日付のリストであり_time、同じデータベースから取得したタイムスタンプのリストです。が付いているすべての変数_は、データベースから取得されたリストです。各リストのCountは、常に他のリストの と等しくなりCountます。

4

2 に答える 2

1

silが言ったように、2つのリストを連結しているため、インデックス範囲がより広いリストになります。Enumerable.Range()を使用してインデックスを生成し、2 つの述語を組み合わせたバージョンを使用してフィルター処理し、最後にSelectMany()でリストを平坦化するこのソリューションはどうですか。

public double CalculateDailyProjectMaxPumpSpm(DateTime date, string start = null, string end = null)
{
    Log("Calculating Daily Pump stroke Max...");

    var spm = Enumerable
         .Range(0, _pumpOneSpm.Count)
         .Where(x => _date[x].Equals(date) &&
                     (start == null ||
                      (DateTime.Compare(_time[x], DateTime.Parse(start)) > 0 && 
                       DateTime.Compare(_time[x], DateTime.Parse(end)) < 0)))
         .SelectMany(x => new [] { _pumpOneSpm[x], _pumpTwoSpm[x] });

    return _dailyProjectMaxSpm = Math.Round(spm.Max(), 2, MidpointRounding.AwayFromZero);
}
于 2012-12-01T00:12:40.133 に答える
1

元の方法では からまでiの範囲ですが、現在は からまで 0_pumpOneSpm.Count0_pumpOneSpm.Count + _pumpTwoSpm.Count

_pumpOneSpm.Count + _pumpTwoSpm.Count次の結果は項目のリストになります。

_pumpOneSpm.Concat(_pumpTwoSpm).Where((t, i) => _date[i] 

forそして、ループを使用した最初のメソッドの例よりも明確なLINQアナログを見ることができません。

于 2012-11-30T22:56:41.650 に答える