【问题标题】:LINQ to Objects auto increment numberLINQ to Objects 自动递增编号
【发布时间】:2009-02-25 17:34:55
【问题描述】:

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

基本上,我正在执行 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 查询的上下文中执行此操作(这样我就不必在查询后循环集合)?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是我的第一个倾向(Gerneraly,我是一个 c# 小伙子)。但是,我不知道 ++ 的任何 vb.net 版本。我很想坚持使用委托方法来处理这个问题,但这比我在如此简单的任务中更喜欢的复杂性增加了。
    • +1 如果您想将代码保留在查询语法而不是 Lambda 语法中,则此方法有效。
    • An expression tree may not contain an assignment operator
    • @klent 在 LINQ to Objects 中当然可以,但其他 LINQ 提供程序的限制更大。从错误中我猜您正在使用 LINQ to Entities:在执行数据库并返回内存后,您需要做这种事情。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我在尝试使用 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)})
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-03
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        相关资源
        最近更新 更多