2010-02-18 5 views
20

Ce qui pourrait être un équivalent LINQ au code suivant?Comment concaténer deux collections par index dans 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]); 
} 

Répondre

24

.NET 4 a un opérateur postal qui vous permet de joindre deux collections ensemble.

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

La méthode .Zip est supérieure à .Choisir ((s, i) => ...) parce que .Choisir lancera une exception lorsque vos collections ne sont pas le même nombre d'éléments, alors que. Zip va simplement compresser autant d'éléments que possible. Si vous êtes sur .NET 3.5, vous devrez vous contenter de .Sélectionnez, ou écrivez votre propre méthode .Zip. Maintenant, tout cela dit, je n'ai jamais utilisé Convert.ChangeType. Je suppose que cela fonctionne pour votre scénario, alors je vais laisser ça.

+1

Ou simplement: 'objets var = values.zip (types, (v, t) => Convert.ChangeType (v, t));' – Ken

+1

Ken, vous avez raison. Je vais mettre à jour mon message. Merci. –

+0

Mis à jour. Merci pour le conseil. –

6

En supposant que les deux tableaux ont la même taille:

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(); 
Questions connexes