Номер автоинкремента LINQ to Objects - PullRequest
6 голосов
/ 25 февраля 2009

Это похоже на базовый вопрос, но, на мой взгляд, я не могу придумать элегантного решения.

По сути, я делаю запрос LINQ, создавая новый объект из запроса. В новом объекте я хочу сгенерировать автоматически увеличенное число, чтобы позволить мне сохранить порядок выбора для последующего использования (в моем примере с именем Iter).

Вот мое текущее решение, которое делает то, что мне нужно:

    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

Есть ли способ сделать это в контексте запроса LINQ (чтобы мне не пришлось зацикливать коллекцию после запроса)?

Ответы [ 4 ]

29 голосов
/ 25 февраля 2009

Прошу прощения за то, что я делал это в C #, не уверен, что синтаксис в VB.NET:

MasterCalendarInstance
    .OrderBy(x => x.Key)
    .Select((x, ixc) => new { CalendarId = x.Key, Iter = ixc });
7 голосов
/ 25 февраля 2009

Я не знаю, возможно ли это в VB, но в C # используется закрытие:

int count = 0
var res = from x in MasterCalendarInstance
          order by x.Key
          select new {
            CalendarId = x.Key,
            Iter = count++
          };
1 голос
/ 05 августа 2014

Вышеуказанные решения можно суммировать в VB.NET следующим образом:

MasterCalendarInstance _
    .OrderBy(Function (x) x.Key) _
    .Select(Function (x, ixc) New With { .CalendarId = x.Key,
                                         .Iter = ixc })
0 голосов
/ 11 марта 2010

Я столкнулся с этим сообщением, пытаясь решить аналогичную проблему с помощью List (of String).

Я публикую свой обходной путь в надежде, что он может быть принят для решения вашей проблемы, но больше для тех, кто сталкивается с этой проблемой с помощью 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)})

Надеюсь, это поможет!

...