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
属性 的值,您可能需要在找到最小值之前将它们转换为正确的可比较类型 DateTime
或 Integer
。
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 意味着有所不同,添加细节。
我只想要每个程序的最短期限,并且 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
属性 的值,您可能需要在找到最小值之前将它们转换为正确的可比较类型 DateTime
或 Integer
。
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 意味着有所不同,添加细节。