9

すべて、私は精神的になりました(これは問題ではありません)。に変換List<string[]>したいList<object[]>

List<string[]> parameters = GetParameters(tmpConn, name);
List<object[]> objParams = parameters.OfType<object[]>();

これは機能していませんが、何かを忘れない限り、このメソッドを使用した変換が可能であるはずです(ラムダは必要ありません)?

御時間ありがとうございます。

4

4 に答える 4

19

次のようなものを使用したい:

List<object[]> objParams = parameters.OfType<object[]>().ToList();

または C# 4.0 では、単に

List<object[]> objParams = parameters.ToList<object[]>();

また

List<object[]> objParams = parameters.ConvertAll(s => (object[])s);
于 2012-06-22T18:51:38.020 に答える
3

OfType<string[]>IEnumerable<string[]>ではなく、を返しますList<object[]>

Enuemrable.OfType無効なキャストを除外します。代わりに検討することをお勧めしEnumerable.Castます。これは、間違えるとスローされます。string[]から継承しない場合object[](正直なところ覚えていません)、Enumerable.Select変換を提供するために電話する必要があるかもしれません。

間違いなく、どこかでEnumerable.ToList呼び出しが必要です。

于 2012-06-22T18:55:28.377 に答える
3

配列の共分散のため、.NET 4.0 では次のようにすることができます。

// Works because:
// a) In .NET, a string[] is an object[]
// b) In .NET 4.0, an IEnumerable<Derived> is an IEnumerable<Base>              
var result = parameters.ToList<object[]>();

ただし、これらの配列を文字列以外で変更することはできないことに注意してください (配列の共分散は本当に安全ではないため)。

本当に柔軟な書き込み可能なオブジェクト配列が必要な場合は、次のことができます。

var result = parameters.Select(array => array.ToArray<object>())
                       .ToList();

(また)

var result = parameters.ConvertAll(array => array.ToArray<object>());

次に、各内部配列の要素を、ほとんど任意の型のインスタンスに置き換えることができます。

于 2012-06-22T18:58:18.430 に答える
0

このようにしたらどうですか

List<string[]> sList = new List<string[]> {new []{"A", "B"}};
List<object[]> oList = sList.Cast<object[]>().ToList();
于 2012-06-22T18:57:48.867 に答える