0

入力として、IDataRecord(抽象テーブルの行)を実装するオブジェクトがあるため、インデクサーがあり、整数を指定することで、あるタイプのオブジェクトを取得できます。出力として、コードはその行のセルの範囲を特定の型オブジェクトの配列として取得する必要があります。

だから私はこのメソッドを書きました(はい、私は知っています、それは拡張メソッドに簡単に変換できますが、これは必要ありません。また、このメソッドをクラスの外に表示したくありません):

private static T[] GetRange<T>(IDataRecord row, int start, int length)
{
    var result = new List<T>();          

    for (int i = start; i < (start + length); i++)
    {
        result.Add((T)row[i]);
    }

    return result.ToArray();
}

正常に動作しますが、このメソッド ロジックは非常に一般的なもののようです。では、.NET Framework FCL/BCL で同じ (またはほぼ同じ) 結果が得られるメソッドはありますか?

4

4 に答える 4

1

SkipTakeを使用します。

var rangeList = result.Skip(start - 1).Take(length);
于 2014-08-22T04:32:23.127 に答える
1

いいえ、BCL にはありません。

ただし、List<>最初に作成してから配列にコピーしないでください。それ自体を返すList<>(そして適切な初期容量で構築する) か、次のようにすぐに配列を作成します。

private static T[] GetRange<T>(IDataRecord row, int start, int length)
{
    var result = new T[length];

    for (int i = 0; i < length; i++)
    {
        result[i] = (T)row[start + i];
    }

    return result;
}

これが代替手段です(すべてのLINQ愛好家向け):

// NB! Lazy enumeration
private static IEnumerable<T> GetRange<T>(IDataRecord row, int start, int length)
{
    return Enumerable.Range(start, length).Select(i => (T)row[i]);
}

ここで、質問へのコメントに記載されていることを繰り返します:インターフェイスSystem.Data.IDataRecord(System.Data.dllアセンブリ内) はorを継承しませIEnumerable<>IEnumerable

于 2014-11-17T11:52:24.030 に答える
0

「TakeARange」が必要な場合は、入力パラメーターとしてコレクションが必要です。ここにはありません。

インデクサーを持つ IDataRecord (たとえば、単一の行) があります。インデクサーの実装で使用するリストを返す Cells というプロパティを公開する必要があります。

メソッドは次のようになります。

private static T[] TakeRange<T>(IEnumerable cells, int start, int length)
{
    return cells.Skip(start - 1).Take(length)
}
于 2014-08-22T07:46:16.387 に答える
0

まあ.. FCL/BCLにはそのような方法はないようです

于 2014-08-26T05:06:42.613 に答える