オブジェクトに詰め込むことができるオブジェクト配列のオブジェクト配列を返すサードパーティのライブラリがあります[]:
object[] arr = myLib.GetData(...);
結果の配列は object[] エントリで構成されるため、戻り値は、行を表す外側の配列と、一部のフィールドが入力されないフィールド値を含む内側の配列 (ギザギザ配列) を持つある種のレコードセットと考えることができます。 . 個々のフィールドにアクセスするには、次のようにキャストする必要があります。
int i = (int) ((object[])arr[row])[col];//access a field containing an int
私は怠け者なので、次のような要素にアクセスしたいと思います。
int i = (int) arr[row][col];
これを行うには、次の Linq クエリを使用します。
object[] result = myLib.GetData(...);
object[][] arr = result.Select(o => (object[])o ).ToArray();
のような単純なキャストを使用してみましobject[][] arr = (object[][])result;
たが、実行時エラーで失敗します。
さて、私の質問:
- これを行う簡単な方法はありますか?気の利いたキャストがそのトリックをやるべきだと感じていますか?
- また、キャストを節約するためだけに多くのデータを再形成する必要があるため、パフォーマンスが心配ですが、これは本当に価値があるのでしょうか?
編集:
迅速な回答をありがとうございました。
@ジェームズ:あなたの答えが新しいクラスで犯人をラップするのが好きですが、欠点は、ソース配列を取り込むときに常にLinqラッピングを行う必要があり、インデクサーが行と列の両方の値int i = (int) arr[row, col];
を必要とすることです(私は完全な行と同様にobject[] row = arr[row];
、申し訳ありませんが最初に投稿しませんでした)。
@Sergiu Mindras: James のように、拡張メソッドはすべてのobject[]
変数に適用されるため、少し危険だと感じています。
@Nair:Linqラッパーを使用する必要がなく、
@quetzalcoatlと@Abe Heidebrechtint i = (int) arr[row][col];
を使用して個々のフィールドまたは行全体にアクセスできるため、実装にあなたの答えを選択しました: のヒントをありがとう.object[] row = arr[row];
Cast<>()
結論: James の回答と Nair の回答の両方を選択できればよいのですが、上で述べたように、Nair のソリューションは (私が思うに) 最高の柔軟性とパフォーマンスを提供してくれます。上記の Linq ステートメントを使用して内部配列を「平坦化」する関数を追加しました。これは、そのような構造を供給する必要がある他の関数があるためです。
これが私が(大まかに)それをどのように実装したかです(Nairのソリューションから取得:
public class CustomArray { プライベート オブジェクト[] データ; public CustomArray(object[] arr) { データ = arr; }
//get a row of the data
public object[] this[int index]
{ get { return (object[]) data[index]; } }
//get a field from the data
public object this[int row, int col]
{ get { return ((object[])data[row])[col]; } }
//get the array as 'real' 2D - Array
public object[][] Data2D()
{//this could be cached in case it is accessed more than once
return data.Select(o => (object[])o ).ToArray()
}
static void Main()
{
var ca = new CustomArray(new object[] {
new object[] {1,2,3,4,5 },
new object[] {1,2,3,4 },
new object[] {1,2 } });
var row = ca[1]; //gets a full row
int i = (int) ca[2,1]; //gets a field
int j = (int) ca[2][1]; //gets me the same field
object[][] arr = ca.Data2D(); //gets the complete array as 2D-array
}
}
それでは - もう一度 - ありがとうございました!このサイトを使用することは、常に本当に喜びであり、啓発です。