Search code examples
c#vb.netlinqgeneric-listgeneric-collections

Query Generic List


I have to log FTP activity using VendorID. Some vendors have multiple FTP user names, but I only need to log one (the latest).

For example:

  • VendorID 1 (two user names)
  • Mike
  • Pete

  • VendorID 4 (two user names)

  • Jack
  • Luis

So I created a class to store the FTP activity:

Public Class VendorClass
  Public VendorID   As Integer
  Public FTPUserName As String  
  Public File   As String
  Public Date As DateTime
End Class
  • I load the file into a list of VendorClass

Question:

How query the list and group by UserID, and return the latest date and time.

Original List

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

Grouped result:

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

My function is only able to select 1 vendor at the time:

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

Solution

  • 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