7

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

基本上,我正在做一个 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

4 回答 4

33

请原谅我在 C# 中执行此操作,不确定 VB.NET 中的语法:

MasterCalendarInstance
    .OrderBy(x => x.Key)
    .Select((x, ixc) => new { CalendarId = x.Key, Iter = ixc });
于 2009-02-25T17:41:03.833 回答
9

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

int count = 0
var res = from x in MasterCalendarInstance
          order by x.Key
          select new {
            CalendarId = x.Key,
            Iter = count++
          };
于 2009-02-25T17:40:02.230 回答
1

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

MasterCalendarInstance _
    .OrderBy(Function (x) x.Key) _
    .Select(Function (x, ixc) New With { .CalendarId = x.Key,
                                         .Iter = ixc })
于 2014-08-05T18:54:53.133 回答
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)})

希望这可以帮助!

于 2010-03-11T18:45:56.977 回答