2012-06-22 10 views
7

Wszystko, poszedłem psychicznie (to nie jest pytanie). Chcę przekonwertować List<string[]> do List<object[]>C# Lista <string[]> do listy <object[]> Konwersja

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

to nie działa, ale chyba zapomnieli czegoś konwersji przy użyciu tej metody powinny być możliwe (nie lambdas potrzebne)?

Dzięki za poświęcony czas.

+1

'... OfType ()' –

Odpowiedz

16

chcesz użyć czegoś takiego:

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

lub w C# 4.0, tylko

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

lub

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

Głupie. Dzięki, stary, byłeś długi piątek ... – MoonKnight

3

OfType<string[]> zwraca IEnumerable<string[]>, a nie List<object[]>.

Enuemrable.OfType odfiltrowuje wszelkie nieprawidłowe rzuty. Możesz zamiast tego rozważyć numer Enumerable.Cast, który zostanie zgłoszony, jeśli popełnisz błąd. Jeśli string[] nie dziedziczy po object[] (szczerze mówiąc, nie pamiętam), być może trzeba będzie zadzwonić pod numer Enumerable.Select, aby podać konwersję.

Zdecydowanie potrzebujesz wywołania Enumerable.ToList gdzieś tam.

0

Jak o robi to w ten sposób

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

powodu macierzy kowariancji, w .NET 4.0, można po prostu zrobić:

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

jednak pamiętać, że nie będzie w stanie mutować te tablice z czymkolwiek innym niż łańcuchami (ponieważ macierz kowariancji nie jest naprawdę bezpieczna).

Jeśli chcesz naprawdę elastyczne zapisywalnych tablic obiektów, można zrobić:

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

(lub)

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

Następnie można wymienić elementy każdej wewnętrznej tablicy z wystąpień prawie każdy wpisz, proszę.

+0

Dzięki za to. Jednak rozwiń moje pytanie typu origonal. Pierwszym z powyższych jest to, co próbowałem, ale bez 'var', dlaczego w tym przypadku' var' robi zasadniczą różnicę - przypuszczam, że odpowiedź brzmi, że robi to obsada 'ToList()' dla mnie. Naprawdę bardzo ... Dzięki za poświęcony czas. – MoonKnight

+0

'var' nie jest wymagany, możesz zrobić' List result = parameters.ToList (); ', więc nie jestem pewien, gdzie twoja pierwotna próba poszła źle. – Ani