VB Linq GroupBy 最小值

VB Linq GroupBy Min

我只想要每个程序的最短期限,并且 return 使用 Linq (VB) 的新程序选择列表。

  Public Class ProgramSelection
    Public term As String
    Public program As String
  End Class

    Sub Main(args() As string)

        Dim ps As New List(Of ProgramSelection)
        ps.Add(New ProgramSelection With {.term = "202009", .program="2803"})
        ps.Add(New ProgramSelection With {.term = "202005", .program="9002"})
        ps.Add(New ProgramSelection With {.term = "202001", .program="2803"})
       
        Dim o = ps.GroupBy(Function(p) New With {Key p.program, p.term }).ToList()
        For Each g In o
            Console.WriteLine(g.Key.program & "---" & g.Key.ToString)
            Console.WriteLine()
        Next
     
    End Sub

按程序分组收集,“select”只有最短期限。

Dim result = programs.GroupBy(Function(p) p.program).
    Select(Function(group) $"{group.Key}---{g.Min(Function(p) p.term)}")

For Each item in result
    Console.WriteLine(item)
Next

基于 .term 属性 的值,您可能需要在找到最小值之前将它们转换为正确的可比较类型 DateTimeInteger

Dim result = programs.GroupBy(Function(p) p.program).
    Select(Function(group)
      Return New ProgramSelection With
      {
        .program = group.Key,
        .term = group.Select(Function(p) Integer.Parse(p.term)).Min().ToString()
      }
    End Function)

For Each program in result
    Console.WriteLine($"{p.program}---{p.term}")
Next

如果我没猜错,您需要选择(过滤器)现有的 List(Of ProgramSelection),其中 term 是最小值,而 return 仅是过滤后的元素在列表中作为新 List(Of ProgramSelection).

您可以GroupBy(),然后,对于每个分组,获取term 属性 的Min() 值并构建一个新程序Selection 元素与分组键和找到的最小值。像这样:

Dim o = ps.GroupBy(Function(p) p.program).
          Select(Function(gp) New ProgramSelection() With {
              .program = gp.Key, .term = gp.Min(Function(p) p.term)
          }).ToList()

另一种方法,使用 Select() 获取分组并使用 OrderBy().First() 根据术语 属性 的最小值过滤选择,转换 - 在这种情况下 -到一个整数值(我不确定它在真实 class 中是否可能。如果你有所有 数字 ):

Dim o = ps.GroupBy(Function(p) p.program).
           Select(Function(gp) gp.OrderBy(Function(p) CInt(p.term)).First()).ToList()

IMO,term 属性 应该是一个整数。无论如何,使用字符串 可以工作 ,但是由于您想要 minimum 值...如果 minimum 意味着有所不同,添加细节。