3

背景:インターフェイスを実装 するジェネリックTimeSeries<T>クラスを作成しました。IEnumerable<IEnumerable<T>>

public interface ITimeSeries<T> : IEnumerable<IEnumerable<T>> 
{
    T[,] DataMatrix { get; }  

    DateTime[] DateTime { get; }

    string[] Variables { get; }
}

public class TimeSeries<T> : ITimeSeries<T>
{
    public IEnumerator<IEnumerable<T>> GetEnumerator()
    {...}

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

クラスは「TimeSeries<T>内部的に」マトリックスデータ構造として実装され、各列は異なる変数を表し、各行は観測値を表します。DateTime[]時間軸を表す追加の配列もあります。

TimeSeries<T>最初に、ループを使用して変数ごとforeachに、また特定の変数(内部ループを使用)のすべての観測を反復できるようにしたいと思いますforeachが、IEnumerableインターフェイス実装の実際の理由は、すべての機能を取得することです。 LINQがIEnumerableインターフェイスを介して提供します。ただし、各観測値のDateTimeの関連付けが損なわれないようにすることができます。

それで、質問のために:GetEnumeratorこれを達成するため のメソッドをどのように実装する必要がありますか?

4

2 に答える 2

2

最も簡単な方法は、行をループして各行の値を返すことです。最初のディメンションが行で、2番目のディメンションが列である行優先の順序で格納していると仮定します。列の主な順序については、以下のrとcを反転するだけです。

public IEnumerator<IEnumerable<T>> GetEnumerator()
{
    int rows = DataMatrix.GetLength(0);
    int cols = DataMatrix.GetLength(1);

     for(int r = 0; r < rows; r++)
     {
        T[] row = new T[cols]();

        for(int c = 0; c < cols; c++)
        {
            row[c] = DataMatrix[r,c];
        }
        yield return row;
    }
}

コピーの作成を避けたい場合は、a ofsまたはofs(のList代わりにa )として実装できます。ListArrayArrayT[][]T[,]

于 2012-12-05T14:14:00.737 に答える
0

各値をラップし、DateTimeスタンプと変数名のプロパティを追加する構造体を追加することにしました。GetEnumeratorメソッドは、ラップされた値の列を生成します。

    public struct TSItem<T>
    {
        public string Variable { get; private set; }
        public DateTime Date { get; private set; }
        public T Value { get; private set; }
    }

    public IEnumerator<IEnumerable<TSItem<T>>> GetEnumerator()
    {
        int rows = DataMatrix.GetLength(0);
        int cols = DataMatrix.GetLength(1);

        for (int c = 0; c < cols; c++)
        {
            var col = new List<TSItem<T>>();

            for (int r = 0; r < rows; c++)
            {
                col.Add(new TSItem<T>(this.Variables[c], this.DateTime[r], 
                                DataMatrix[r, c]));
            }
            yield return col;
        }
    }

これはおそらく最もパフォーマンスの高いソリューションではありませんが、LINQクエリに関して私が望むものを実現します。

于 2012-12-05T17:45:23.613 に答える