当数据和时间在不同的数组中时,以时间范围模式获取数据

时间:2013-02-13 13:05:51

标签: c# .net arrays linq

我有一个数据数组(double []数据)和一个日期时间列表(List datetimes)。数据数组的每个位置都与日期时间的位置有关。我的意思是:data [i]是在datetimes [i]中收集的。

现在我想过滤使用周模式(7天,24小时)收集的数据。 所以,我有周模式:

class WeekPattern
{

    List<DayPattern> week;


    public WeekPattern(List<DayPattern> _week)
    {
        week = _week;
    }

    public bool isInRange(DateTime time)
    {
        return week.Any(i => i.isInRange(time));
    }

}

class DayPattern
{

    DayOfWeek day;
    List<bool> hours;

    public DayPattern(List<bool> _hours, DayOfWeek _day)
    {
        hours = _hours;
        day = _day;
    }

    public bool isInRange(DateTime time)
    {
        if (time.DayOfWeek != day)
            return false;

        return hours[time.Hour];
    }

}

过滤范围内的日期时间很简单(我已经读过Weekpattern模式对象)

double[] data = { 1, 2, 3, 4}
string[] times = { "23/01/2013 12:00", "23/01/2013 13:00", "23/01/2013 14:00", "23/01/2013 15:00" }
List<DateTime> datetimes = Array.ConvertAll(_times, time => DateTime.ParseExact(time, "dd/MM/yyyy HH:mm:ss", null)).ToList();

Weekpattern pattern... // Weekpattern object
List<DateTime> filter = datetimes.Where(i => pattern.isInRange(i)).ToList();

但是,我如何获取数据过滤(double []数据过滤)而不是日期时间过滤的日期时间列表?

  • 1于23/01/2013 12:00
  • 收集
  • 2于23/01/2013 13:00
  • 收集
  • 3于23/01/2013 14:00
  • 收集
  • 4于23/01/2013 15:00
  • 收集

假设我有一个范围“星期三,13:00-14:00”。所以我想得到一个带有2和3的双打数组:

data = { 2, 3 }

2 个答案:

答案 0 :(得分:1)

获得匹配日期列表后,只需在每个匹配项的日期时间列表中调用IndexOf()函数,然后使用return从double []中提取值。

样品:

        var date = new DateTime(2013, 1, 12);
        List<DateTime> dates = new List<DateTime>() { new DateTime(2013, 1, 11), date, new DateTime(2013, 1, 13) };
        double[] values = new double[] { 0, 1, 2 };

        var filtered = dates.Where(x => x == date);
        foreach (var found in filtered)
        {
            Console.Write(values[dates.IndexOf(found)]);
        }

        Console.ReadLine();

答案 1 :(得分:0)

您可以尝试这样的事情(Select方法的这个重载接受元素索引):

        var filteredData = datetimes.Select((date, i) =>
        {
            if (pattern.isInRange(date))
            {
                return data[i];
            }
            else
            {
                return -1;
            }
        });

唯一的问题是我需要验证值是否等于-1。但这对我有用。

编辑:更好的解决方案是使用在lambda表达式上使用元素索引的Where方法重载:

        var filteredData = data.Where((d, i) =>
        {
            return pattern.isInRange(datetimes[i]);
        });