0

変数がありますList< Tuple< DateTime, double>> myList
を指定すると、を使用して の前にある がdatetime返されることを願っています。 たとえば、が提供され、datetime が this より前にあるリスト内の最後のタプルを表示したい。 TupledatetimeLinq
if "2013-Feb-08 21:34:00"timestamp

でこれを行うにはどうすればよいLinqですか?

編集:
myList.Where(t => t.Item1 < タイムスタンプ).Last();
私の問題を解決しました。
myList.TakeWhile(t => t.Item1 < timestamp).Last();と比較して、どちらがパフォーマンスの点で優れています。

4

4 に答える 4

2

MoreLinq MaxBy (NuGet から入手可能) の場合:

myList.Where(t => t.Item1 < timestamp).MaxBy(t => t.Item1);

または (項目がソートされている場合):

myList.TakeWhile(t => t.Item1 < timestamp).Last();

UPDATE (二分探索あり) 書き込み比較子:

public class MyComparer : IComparer<Tuple<DateTime, double>>
{
    public int Compare(Tuple<DateTime, double> x, Tuple<DateTime, double> y)
    {
        return x.Item1.CompareTo(y.Item1);
    }
}

次に検索

   int index = myList.BinarySearch(new Tuple<DateTime, double>(timestamp, 0), 
                                   new MyComparer());

   if (index == 0)
      // there is no items before timestamp

   if (index > 0)
      result = myList[index - 1]; // your item is previous

   if (index < 0) // no tuple with date equal to timestamp
      var nearestIndex = ~index;
      if (nearestIndex > 0)
          result = myList[nearestIndex - 1];
于 2013-02-05T06:47:26.700 に答える
1
var result = myList.OrderByDescending(t => t.Item1)
  .SkipWhile(t => t.Item1 > timestamp)
  .First();
于 2013-02-05T06:56:16.747 に答える
1

最高のパフォーマンスを得るには、LINQ をまったく使用しないでください。二分探索は、LINQ が提供できる O(n) の代わりに O(log n) のパフォーマンスを提供します。

タイプの比較子を作成します。

public class MyListComparer : IComparer<Tuple<DateTime, double>> {

  public int Compare(Tuple<DateTime, double> x, Tuple<DateTime, double> y) {
    return x.Item1.CompareTo(y.Item1);
  }

}

BinarySearchメソッドで比較子を使用します。

int idx = myList.BinarySearch(new Tuple<DateTime, double>(new DateTime(2013,2,8,21,34,0), 0), new MyListComparer());
if (idx < 0) {
  idx = (~idx) - 1;
}
Tuple<DateTime, double> item = myList[idx];
于 2013-02-05T07:23:26.623 に答える
0

myList.Where(t => t.Item1 < datetime).OrderByDescending(t => t.Item1).Last();

于 2013-02-05T06:42:14.097 に答える