【问题标题】:Query Generic List查询通用列表
【发布时间】:2015-08-06 13:35:18
【问题描述】:

我必须使用 VendorID 记录 FTP 活动。 有些供应商有多个 FTP 用户名,但我只需要登录一个(最新的)。

例如:

  • VendorID 1(两个用户名)
  • 迈克
  • 皮特

  • VendorID 4(两个用户名)

  • 杰克
  • 路易斯

所以我创建了一个类来存储 FTP 活动:

Public Class VendorClass
  Public VendorID   As Integer
  Public FTPUserName As String  
  Public File   As String
  Public Date As DateTime
End Class
  • 我将文件加载到 VendorClass 列表中

问题:

如何通过UserID查询列表和分组,并返回最新的日期和时间。

原始列表

VendorID    FTP UserName    File                Date
1           Mike            BalanceSheet.csv    6/17/2015 10:20
1           Pete            BalanceSheet.csv    6/17/2015 10:40
2           Ron             BalanceSheet.csv    6/17/2015 10:20
3           Julia           BalanceSheet.csv    6/17/2015 14:20:02 
4           Jack            BalanceSheet.csv    6/17/2015 11:20
4           Luis            BalanceSheet.csv    6/17/2015 09:20

分组结果:

VendorID    FTP UserName    File                Date
1           Pete            BalanceSheet.csv    6/17/2015 10:40
2           Ron             BalanceSheet.csv    6/17/2015 10:20
3           Julia           BalanceSheet.csv    6/17/2015 14:20:02
4           Jack            BalanceSheet.csv    6/17/2015 11:20

我的功能当时只能选择 1 个供应商:

Private Function FlattenDuplicateEntries(ActivityList As List(Of VendorClass)) As List(Of VendorClass)
    FlattenDuplicateEntries = New List(Of VendorClass)

    For Each vendor In FTPUserNameList
        Dim val As New VendorClass
        val = ActivityList.Find(Function(value As VendorClass) value.VendorID = vendor.VendorID)
    Next    
End Function

【问题讨论】:

  • 您要求UserId 的列表,但您的类型中没有UserId:您的意思是VendorID

标签: c# vb.net linq generic-list generic-collections


【解决方案1】:
Private Function FlattenDuplicateEntries(ActivityList As List(Of VendorClass)) As List(Of VendorClass) 
    Dim filtered As New Dictionary(Of Integer, VendorClass)()
    For Each vendor In ActivityList
        If Not filtered.ContainsKey(vendor.VendorID) Then
            filtered.Add(vendor.VendorID, vendor)
        Else If filtered(vendor.VendorID).Date < vendor.Date Then
            filtered(vendor.VendorID) = vendor
        End If
    Next 
    Return filtered.Values.ToList()   
End Function

【讨论】:

  • 这一行 (filtered.Add(vendor)) 给出了以下异常:Argument not specified for parameter 'value' of 'Public Sub Add(key As TKey, value As TValue)'
【解决方案2】:

(由于这也被标记为 C#,我不会尝试翻译成 VB。)

类似:

var lastByVendor = from act in ActivityList
                   group by act.VendorID into grp
                   let last = grp.OrderByDescending(x => x.Date).First()
                   select new {
                     VendorId = grp.Key,
                     Date = last.Date,
                     File = last.File,
                     FTPUserName = last.FTPUserName
                   };

在这个我:

  • 按 VendorID 分组并为每个供应商完成其余的工作
  • 获取最后一条记录(BCL 中没有MaxBy 运算符,所以使用排序)
  • 组的Key 是group by的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多