LINQ to Objects自动递增编号

时间:2009-02-25 17:34:56

标签: asp.net vb.net linq-to-objects

这感觉就像一个完全基本的问题,但是,对于我的生活,我似乎无法找到一个优雅的解决方案。

基本上,我正在进行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 个答案:

答案 0 :(得分:29)

请原谅我在C#中这样做,不确定VB.NET中的语法:

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

答案 1 :(得分:7)

我不知道这在VB中是否可行,但在C#中使用了闭包:

int count = 0
var res = from x in MasterCalendarInstance
          order by x.Key
          select new {
            CalendarId = x.Key,
            Iter = count++
          };

答案 2 :(得分:1)

以上解决方案可以在VB.NET中总结如下:

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

答案 3 :(得分:0)

我试图用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)})

希望这有帮助!