1

我有一个 listrms.PositiveResponse和另一个 list rms.NegativeResponse。列表包含 aRecruitID和 a Timestamp。我有超过 10,000 条记录。

我正在从 Web 服务获取这些数据。

问题在于找出 a 的最新更新RecruitID是正面响应还是负面响应。我怎样才能确定呢?我有Timestampfor each RecruitID,最新的时间戳可以告诉我最新的更新。我怎样才能知道 a 的最新更新是什么,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);
    }
   }
}
4

2 回答 2

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();
于 2012-07-19T08:18:30.537 回答
1

看待问题的一种方式是,您遇到的主要问题是您没有关于源数据的指示符来判断响应是 +ve 还是 -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());

    }

我们从每个列表中选择一个新的(匿名)记录,其中包含 Id、时间戳和类型“Pos”或“Neg”,然后将它们合并到一个新列表中。

一旦我们有了新列表,就很容易按 Id 分组,然后选择时间戳最高的记录。该记录将具有 Id、Timestamp 和 Pos/Neg 指示器。

于 2012-07-19T08:44:09.010 回答