2015-08-06 3 views
0

Мне нужно регистрировать активность FTP, используя VendorID. Некоторые поставщики имеют несколько имен пользователей 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 
  • я загрузить файл в список Класс_вендоров

Вопрос:

Как запросить список и группу по 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 
+0

Вы запрашиваете список по 'UserId', но в вашем типе нет' UserId': вы имеете в виду 'VendorID'? – Richard

ответ

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 
+0

Эта строка (отфильтрованная.Add (vendor)) дает следующее исключение: Аргумент не указан для параметра 'value' of 'Public Sub Add (key As TKey, value As TValue)' –

+0

Исправлена ​​ошибка. –

0

(как это помечено 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 
        }; 

В I:

  • группы по VendorID и сделать остальное для каждого поставщика
  • Получить последнюю запись (нет MaxBy оператора в BCL, поэтому с помощью сортировки)
  • Key группы - это значение из группы
Смежные вопросы