1

データの配列(double [] data)と日時のリスト(List datetimes)があります。データ配列の各位置は、日時の位置に関連しています。つまり、data[i]はdatetimes[i]で収集されました。

次に、収集されたデータを1週間のパターン(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は2013年1月23日12:00に収集されました
  • 2は2013年1月23日13:00に収集されました
  • 3は2013年1月23日14:00に収集されました
  • 4は2013年1月23日15:00に収集されました

「水曜日、13:00〜14:00」の範囲があるとします。したがって、2と3のdoubleの配列を取得したいと思います。

data = { 2, 3 }
4

2 に答える 2

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();
于 2013-02-13T13:31:46.063 に答える
0

次のようなことを試すことができます(Selectメソッドのこのオーバーロードは要素インデックスを受け入れます):

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

唯一の問題は、値が-1に等しいかどうかを確認する必要があることです。しかし、これは私にとってはうまくいきます。

編集:より良い解決策は、ラムダ式の要素インデックスを使用するWhereメソッドのオーバーロードを使用することです。

        var filteredData = data.Where((d, i) =>
        {
            return pattern.isInRange(datetimes[i]);
        });
于 2013-02-13T13:32:28.060 に答える