2009-02-25 7 views
6

To wydaje się być zupełnie podstawowym pytaniem, ale dla mojego życia nie potrafię wypracować eleganckiego rozwiązania.LINQ to Objects auto increment number

Zasadniczo robię kwerendę LINQ, tworząc nowy obiekt z kwerendy. W nowym obiekcie chcę wygenerować automatycznie zwiększaną liczbę, aby umożliwić zachowanie kolejności wyboru do późniejszego wykorzystania (w moim przykładzie nazwano Iter).

Oto mój obecny rozwiązanie, które robi to, czego potrzebuję:

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 

Czy istnieje sposób, aby zrobić to w kontekście zapytania LINQ (tak, że nie mam do pętli kolekcję po sobie pytanie)?

Odpowiedz

29

pardon za to zrobić w C# nie wiesz dokładnie składni w VB.NET:

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

Nie bardzo rozumiem, jak to rozwiązuje mój problem. w jaki sposób wartość ixc jest zapełniana i automatycznie zwiększana? – Nathan

+3

automagicznie :) jest przeciążeniem dla metody rozszerzenia .Select, która przyjmuje Func (patrz http://msdn.microsoft.com/en-us/library/bb534869.aspx) – veggerby

+0

Dzięki temu rozwiązał mój problem. Doceniam pomoc! – Nathan

7

nie wiem czy jest to możliwe w VB, C#, ale w jednym używa Zamknięcie:

+0

Zobacz inne Odpowiedź:/jest/było możliwe ... – Richard

+0

To mój pierwszy nachylenia (Gerneraly jestem aC# gość). Jednak nie jestem świadomy żadnej wersji vb.net ++. Kusiło mnie, aby użyć metody delegatów, aby poradzić sobie z tym, ale to dodaje więcej komplikacji, niż ja wolę w tak prostym zadaniu. – Nathan

+1

+1 Działa to, jeśli chcesz zachować kod w składni zapytania zamiast składni Lambda. – Douglas

0

Wpadłem na ten post, próbując rozwiązać podobny problem z listą (ciągu).

Zamieszczam moje obejście w nadziei, że zostanie ono przyjęte w celu rozwiązania problemu, ale bardziej dla każdego, kto napotka na ten problem z Listą (Of 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)}) 

Mam nadzieję, że to pomoże!

1

powyższych rozwiązań nie mogą być sumowane w VB.NET tak:

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