2009-02-25 12 views
6

Esto se siente como una pregunta completamente básica, pero, por mi vida, parece que no puedo encontrar una solución elegante.LINQ to Objects incremento automático número

Básicamente, estoy haciendo una consulta LINQ creando un nuevo objeto a partir de la consulta. En el nuevo objeto, quiero generar un número autoincrementado para permitirme mantener un orden de selección para su uso posterior (llamado Iter en mi ejemplo).

Aquí está mi solución actual que hace lo que necesito:

Dim query2 = From x As DictionaryEntry In MasterCalendarInstance _ 
       Order By x.Key _ 
       Select New With {.CalendarId = x.Key, .Iter = 0} 

    For i = 0 To query2.Count - 1 
     query2(i).Iter = i 
    Next 

¿Hay una manera de hacer esto en el contexto de la consulta LINQ (para que yo no tengo que bucle de la colección después de la consulta)?

Respuesta

29

Perdón por hacer esto en C# no está seguro exactamente de la sintaxis en VB.NET:

MasterCalendarInstance 
    .OrderBy(x => x.Key) 
    .Select((x, ixc) => new { CalendarId = x.Key, Iter = ixc }); 
+0

No veo muy bien cómo esto resuelve mi problema. ¿Cómo se llena el valor de ixc y se incrementa automáticamente? – Nathan

+3

automágicamente :) es una sobrecarga para el método de extensión .Select que toma un Func (vea http://msdn.microsoft.com/en-us/library/bb534869.aspx) – veggerby

+0

Gracias esto resolvió mi problema Aprecio la ayuda! – Nathan

7

No sé si esto es posible en VB, pero en C# se utiliza un cierre:

+0

Ver otra respuesta: este/es/ – Richard

+0

posible ... Esta fue mi primera inclinación (Gerneraly, estoy aC# tio) Sin embargo, no conozco ninguna versión de vb.net de ++. Estuve tentado de utilizar un método delegado para manejar esto, pero eso agrega más complicaciones de las que prefiero en una tarea tan simple. – Nathan

+1

+1 Esto funciona si desea mantener el código en la sintaxis de la consulta en lugar de la sintaxis Lambda. – Douglas

0

Me encontré con esta publicación al intentar resolver un problema similar con una lista (de cadena).

Estoy publicando mi solución con la esperanza de que pueda ser adoptada para resolver su problema, pero más para cualquier otra persona que se encuentre con este problema con una Lista (De T).

Dim list As New List(Of String) 
list.Add("Test1") 
list.Add("Test2") 
list.Add("Test3") 

Dim var = list.Select(Function(s) New With {.Name = s, .RecordID = list.IndexOf(s)}) 

Espero que esto ayude!

1

Las soluciones anteriores se podrían resumir en VB.NET así:

MasterCalendarInstance _ 
    .OrderBy(Function (x) x.Key) _ 
    .Select(Function (x, ixc) New With { .CalendarId = x.Key, 
             .Iter = ixc }) 
Cuestiones relacionadas