2012-06-22 10 views
7

すべて、私は精神的になった(これは質問ではありません)。私は、この動作していないList<object[]>C#リスト<string[]>リストへ<object[]>変換

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

List<string[]>を変換したいが、私は何かを忘れてしまった場合を除き、このメソッドを使用して変換が(何のラムダは必要ありません)が可能でなければなりませんか?

お時間をいただきありがとうございます。あなたが好きなものを使用したい

+1

'... OfType ()' –

答えて

16

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

またはC#4.0での、ちょうど

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

または

List<object[]> objParams = parameters.ConvertAll(s => (object[])s); 
+1

だから愚かです。ありがとうございました、長い金曜日でした... – MoonKnight

3

OfType<string[]>戻りIEnumerable<string[]>、ないList<object[]>

Enuemrable.OfTypeは、無効なキャストを除外します。代わりにEnumerable.Castを考えてみてください。間違えた場合は投げてしまいます。 string[]object[]から継承されていない場合(私は正直覚えていません)、変換を提供するにはEnumerable.Selectに電話する必要があります。

どこかでEnumerable.ToListコールが必要です。

// 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[]>(); 

しかし、あなたが変異することができないだろうことに注意を:なアレイ共分散のこのよう

List<string[]> sList = new List<string[]> {new []{"A", "B"}}; 
List<object[]> oList = sList.Cast<object[]>().ToList(); 
0

文字列以外のものを持つ配列(配列の共分散は本当に安全ではないため)

あなたが本当に柔軟な書き込み可能なオブジェクト配列をしたい場合は、あなたが行うことができます:

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

(または)

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

次に、あなたはかなりの任意のインスタンスと各内部配列の要素を置き換えることができますお願いします。

2

それをやって、.NET 4.0で、あなただけ行うことができますどのように

+0

ありがとうございました。しかし、私の元の型付きの質問を無視してください。最初のものは私が試したものですが、 'var'なしで、なぜこのケースでは' var'が決定的な違いになるのでしょうか?答えは、私のために 'ToList()'を実行しているということです。本当にうーん...あなたの時間をありがとう。 – MoonKnight

+0

'var'は必須ではありません。' List result = parameters.ToList (); 'を実行すると、元の試行が間違っていたかどうかわかりません。 – Ani

関連する問題