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

在原来的方法i是在范围从0_pumpOneSpm.Count但现在从0_pumpOneSpm.Count + _pumpTwoSpm.Count

以下结果是_pumpOneSpm.Count + _pumpTwoSpm.Count项目列表:

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

而且我看不到 LINQ 模拟,这比使用for循环的第一个方法示例更清楚。

于 2012-11-30T22:56:41.650 回答
1

就像 sil 说的那样,您将两个列表连接起来,从而产生一个具有更大索引范围的列表。这个解决方案怎么样,它使用Enumerable.Range()生成索引,然后使用两个谓词的组合版本进行过滤,最后使用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 回答