2010-02-18 18 views
20

Co może być równoważnikiem LINQ do następującego kodu?Jak połączyć dwie kolekcje według indeksu w LINQ

string[] values = { "1", "hello", "true" }; 
Type[] types = { typeof(int), typeof(string), typeof(bool) }; 

object[] objects = new object[values.Length]; 

for (int i = 0; i < values.Length; i++) 
{ 
    objects[i] = Convert.ChangeType(values[i], types[i]); 
} 

Odpowiedz

24

.NET 4 ma operator pocztowy, który pozwala połączyć dwa zbiory razem.

var values = { "1", "hello", "true" }; 
var types = { typeof(int), typeof(string), typeof(bool) }; 
var objects = values.Zip(types, (val, type) => Convert.ChangeType(val, type)); 

Sposób .zip jest lepsza .Wybrać ((s, i) => ...) bo .Wybrać rzuci wyjątek, gdy zbiory nie mają taką samą liczbę elementów, natomiast. Zip po prostu zapakuje jak najwięcej elementów.

Jeśli korzystasz z .NET 3.5, to musisz się zadowolić. Wybierz lub wpisz własną metodę .Zip.

Teraz wszystko, co powiedzieliśmy, nigdy nie używałem Convert.ChangeType. Zakładam, że działa to w twoim scenariuszu, więc odejdę.

+1

lub po prostu: 'obiekty var = values.zip (typy, (v, t) => Convert.ChangeType (v, t));' – Ken

+1

Ken, masz rację. Zaktualizuję mój post. Dzięki. –

+0

Zaktualizowano. Dzięki za wskazówkę. –

6

Zakładając obie tablice mają ten sam rozmiar:

string[] values = { "1", "hello", "true" }; 
Type[] types = { typeof(int), typeof(string), typeof(bool) }; 

object[] objects = values 
    .Select((value, index) => Convert.ChangeType(value, types[index])) 
    .ToArray(); 
4
object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i])) 
         .ToArray();