2012-07-19 112 views
1

我有一個列表rms.PositiveResponse,和另一個列表rms.NegativeResponse s。該列表包含一個RecruitID和一個Timestamp。我有超過10,000條記錄。查找列表中的最新記錄

我從Web服務獲取這些數據。

問題是如果RecruitID的最新更新是積極響應或消極響應。我如何確定?我有Timestamp每個RecruitID,最新的時間戳可以告訴我最新的更新。我怎樣才能知道RecruitID的最新更新是什麼,以便我可以將其存儲在數據庫中?

這是我的嘗試,但這是比較慢的方法,我想知道是否有更快的方法。

RMSDataService.RMS rms = new RMSDataService.RMS(); 
var negList = rms.NegativeResponse.Where(d => d.RLMSTimeStamp != null && d.RLMSTimeStamp > new DateTime(2012, 02, 22)); 
var posList = rms.PositiveResponse.Where(d => d.RLMSTimeStamp != null && d.RLMSTimeStamp > new DateTime(2012, 02, 22)); 

foreach (var pos in posList) 
{ 
    foreach(var neg in negList) 
    { 
    if(neg.RLMSRecruitId == pos.RLMSRecruitId && neg.RLMSTimestamp > pos.RLMSTimestamp) 
    { 
     Console.WriteLine("Item fetched: RecruitId:{0} NegTimeStamp:{1} PosTimeStamp:{2}", neg.RLMSRecruitId, neg.RLMSTimeStamp, pos.RLMSTimeStamp); 
    } 
    } 
} 
+0

將兩個列表連接在一起,按時間戳排序,然後比較最後一個和最後一個。 – slugster 2012-07-19 08:11:24

回答

1

試試這個:

var negList = rms.NegativeResponse.Where(d => d.RLMSTimeStamp != null && d.RLMSTimeStamp > new DateTime(2012, 02, 22)).toList(); 
var posList = rms.PositiveResponse.Where(d => d.RLMSTimeStamp != null && d.RLMSTimeStamp > new DateTime(2012, 02, 22)).toList(); 


var item = (from pos in posList 
      join neg in negList 
       on 
       pos.RLMSRecruitId equals neg.RLMSRecruitId 
       orderby pos.RLMSTimestamp descending 
       select pos).FirstOrDefault(); 
+0

不支持方法連接。 – SupaOden 2012-07-19 08:28:39

+2

將.ToList()添加到這兩個查詢中。然後將支持所有linq-to-objects方法 – 2012-07-19 08:33:30

+0

@TomasGrosup謝謝我編輯了我的答案。 – 2012-07-19 08:39:42

1

一個看待問題的方式是,你有主要的問題是,你必須對源數據沒有指示,以響應是否是+已經或-ve。因此,創建一個具有該指標的新列表,然後您可以輕鬆找到每個Id的最新時間記錄和響應類型的記錄。

例如

class Record { 
    public int Id { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

private Record[] PositiveResponses = new[]{ 
    new Record{ Id =1 , Timestamp = new DateTime(2012,1,1)}, 
    new Record{ Id =1 , Timestamp = new DateTime(2012,1,2)}, 
    new Record{ Id =2 , Timestamp = new DateTime(2012,1,3)}, 
    new Record{ Id =2 , Timestamp = new DateTime(2012,1,5)}, // latest for id 2 
    new Record{ Id =3 , Timestamp = new DateTime(2012,1,8)}, 
    new Record{ Id =4 , Timestamp = new DateTime(2012,1,8)} // latest for Id 4 
}; 

private Record[] NegativeResponses = new[]{ 
    new Record{ Id =1 , Timestamp = new DateTime(2012,1,1)}, 
    new Record{ Id =1 , Timestamp = new DateTime(2012,1,3)}, // latest for Id 1 
    new Record{ Id =2 , Timestamp = new DateTime(2012,1,4)}, 
    new Record{ Id =3 , Timestamp = new DateTime(2012,1,9)} // latest for id 3 
}; 


[TestMethod] 
public void GetLatest() { 

    var results = PositiveResponses.Select(r => new { 
                Id = r.Id, 
                Timestamp = r.Timestamp, 
                Type = "Pos" 
               }) 
            .Union(
        NegativeResponses.Select(r => new {Id = r.Id, 
                Timestamp = r.Timestamp, 
                Type = "Neg"})) 
        .GroupBy(r => r.Id) 
        .Select(grp => grp.OrderByDescending(r => r.Timestamp).First()); 

    } 

我們選擇與標識,時間戳和類型「POS」或「負極」每個列表一個新的(匿名)的記錄,然後工會他們進入一個新的列表。

一旦我們有了新的列表,很容易按ID進行分組,然後選擇具有最高時間戳的記錄。該記錄將具有Id,時間戳和Pos/Neg指示符。