1

listrms.PositiveResponseと別の listがありrms.NegativeResponseます。リストには aRecruitIDと aが含まれますTimestamp。私は10,000以上のレコードを持っています。

このデータは Web サービスから取得しています。

問題は、の最新の更新がRecruitID肯定的な反応だったのか、否定的な反応だったのかを調べることです。どうすればそれを判断できますか?私はTimestampfor eachを持ってい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);
    }
   }
}
4

2 に答える 2

1

質問を見る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 に答える
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 に答える