0

インデクサーが定義されているクラスを使用しており、そこからデータを取得して単純な配列に入れたいと考えています。インデクサーをループするよりも良い方法はありますか?

インデクサー:

public class MyIndexer
{
    public int Foo { get; }
    public int GetSize{ get; }  //size of data vector
    public float this[int idx] { get; set; }
}

このようなものがいいでしょう:

float[] data = indexer.GetData();

変更できないことに注意してくださいMyIndexer

4

3 に答える 3

1

いいえ、インデックスをループする以外に方法はありません。ループを実行する方法はたくさんありますが、それを回避する方法はありません。

また、インデックスのループは、インデクサーが期待するインデックスの値を実際に返すことができる場合にのみ機能します。クラスにインデクサーがあるからといって、特定のインデックスを処理するためにインデクサーを実装する必要があるわけではありません。

于 2012-08-17T18:47:39.697 に答える
1

要素の数を取得できるので、拡張メソッドを作成できます。

public static float[] GetData(this MyIndexer indexer)
{
    return Enumerable.Range(0, indexer.GetSize).Select(i => indexer[i]).ToArray();
}

for ループを使用することもできます。

public float[] GetData(this MyIndexer indexer)
{
    float[] data = new float[indexer.GetSize];
    for(int i = 0; i < data.Length; i++)
    {
        data[i] = indexer[i];
    }
}
于 2012-08-17T18:36:00.870 に答える
0

そこにあるものから、ループすることが唯一の方法です。

私はクラスの開発者にかなりイライラするでしょう。.NET には、よく知られているインターフェイスによってバックアップされる規則があります。ICollectionICollection<T>IListIList<T>特に適切であること。

配列とstringの使用はほぼ例外ですが、「GetSize」を呼び出す理由(または実際には、「GetXXX」の形式でプロパティを呼び出すLength理由) を考えることができる唯一の理由は、GetSizeクラスを使用していて、私はそれらが本当に嫌いでした。実装しないことICollection<float>は正当化される可能性が少し高くなりますが、それでも気にしないというよりも、正当な理由で正当化されるものです。

この性質のほとんどのクラスは を実装するためICollection<float>、これが発生するほとんどの場合、次のことができます。

float[] arr = new float[indexer.Count];
indexer.CopyTo(arr, 0);

しかし、まだ最も奇妙なのは、実装さえしていないという事実ですIEnumerable<float>。それは本当に、本当に奇妙です。これは .NET のやり方の核心部分であり、本当に正当な理由がない限り、省略されたバグに近いものです。もしそうなら、あなたはちょうどできたはずですindex.ToArray().

このオブジェクトを頻繁に使用する必要がある場合は、ラッパー クラスまたは少なくとも一連の拡張メソッドを作成して、ギャップを埋めるでしょう。

于 2012-08-17T19:08:37.303 に答える