Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ to Objects auto increment number

This feels like a completely basic question, but, for the life of me, I can't seem to work out an elegant solution.

Basically, I am doing a LINQ query creating a new object from the query. In the new object, I want to generate a auto-incremented number to allow me to keep a selection order for later use (named Iter in my example).

Here is my current solution that does what I need:

    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

Is there a way to do this within the context of the LINQ query (so that I don't have to loop the collection after the query)?

like image 892
Nathan Avatar asked Feb 25 '09 17:02

Nathan


3 Answers

Pardon me for doing this in C# not sure exactly the syntax in VB.NET:

MasterCalendarInstance
    .OrderBy(x => x.Key)
    .Select((x, ixc) => new { CalendarId = x.Key, Iter = ixc });
like image 88
veggerby Avatar answered Oct 04 '22 13:10

veggerby


I don't know if this is possible in VB, but in C# one uses a closure:

int count = 0
var res = from x in MasterCalendarInstance
          order by x.Key
          select new {
            CalendarId = x.Key,
            Iter = count++
          };
like image 40
Richard Avatar answered Oct 04 '22 13:10

Richard


The above solutions could be summed up in VB.NET like this :

MasterCalendarInstance _
    .OrderBy(Function (x) x.Key) _
    .Select(Function (x, ixc) New With { .CalendarId = x.Key,
                                         .Iter = ixc })
like image 25
Invvard Avatar answered Oct 04 '22 11:10

Invvard