0

我有一个变量List< Tuple< DateTime, double>> myList
给定 a datetime,希望它通过 using返回Tuple前面的那个。 例如,提供了,想要查看列表中日期时间在 this 之前的最后一个 Tuple 。 datetimeLinq
if "2013-Feb-08 21:34:00"timestamp

我该怎么做Linq

编辑:
myList.Where(t => t.Item1 < timestamp).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();

更新(使用二进制搜索)写入比较器:

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。二进制搜索提供了 O(log n) 的性能,而不是 LINQ 可以提供的 O(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 回答