La version .NET de Zip ne sera pas gérer un nombre arbitraire de tableaux comme le ferait Python. Vous aurez besoin d'appeler deux fois Zip:
Dim first As String() = { "a", "b", "c" }
Dim second As Integer() = { 1, 2, 3 }
Dim third As String() = { "x", "y", "z" }
Dim query = first.Zip(second, Function(f, s) New With { .First = f, .Second = s }) _
.Zip(third, Function(o, t) New With { o.First, o.Second, .Third = t })
For Each item in query
Console.WriteLine("{0}, {1}, {2}", item.First, item.Second, item.Third)
Next
Une autre option serait d'utiliser le Enumerable.Select
method surchargé qui inclut l'indice. Cette approche repose sur les types avec lesquels vous travaillez permettant l'accès par index. Je ne recommanderais pas de substituer l'accès à l'index par la méthode ElementAt
à des fins de performances. En outre, cette approche suppose que toutes les collections ont la même longueur, sinon elle lèvera une exception. Il fonctionne comme suit:
Dim query2 = first.Select(Function(f, i) New With { .First = f, .Second = second(i), .Third = third(i) })
EDIT: Une pensée est de tirer parti de Python directement et appeler à partir VB.NET. Je ne suis pas vraiment sûr de la façon dont cela sera traité, et il y aura une courbe d'apprentissage pour tout mettre en place. Recherchez "appel python de C#" ou de "vb.net" pour plus d'informations sur ce sujet.
Le défi est que vous ne pouvez pas créer dynamiquement un type anonyme. L'approche la plus proche que je suis venu avec est d'utiliser 0. NET 4.0 ExpandoObject
. Pour utiliser le mot-clé dynamic
de C# dans VB.NET, vous devriez être en mesure d'initialiser un objet sans spécifier le type, tel que Dim o = 5
car c'est vraiment un object
en dessous. Vous devrez probablement définir Option Infer On
et
actuellement en utilisant le rendement dans une boucle pour créer de nouveaux IEnumerable. J'aimerai quand même voir s'il est possible de faire avec Zip imbriqué ... – user544111