列出元组日期时间

时间:2013-02-05 06:35:54

标签: c# linq

我有一个变量List< Tuple< DateTime, double>> myList 给定datetime,希望它返回前面的Tuple datetime Linq使用if "2013-Feb-08 21:34:00" 例如,提供timestamp,想要 查看列表中的最后一个元组,其日期时间早于此Linq

如何使用{{1}}?

执行此操作

编辑:
myList.Where(t =&gt; t.Item1&lt; timestamp).Last();
解决了我的问题。 与性能相比,哪种性能更好 myList.TakeWhile(t =&gt; t.Item1&lt; timestamp).Last();

4 个答案:

答案 0 :(得分: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];

答案 1 :(得分:1)

var result = myList.OrderByDescending(t => t.Item1)
  .SkipWhile(t => t.Item1 > timestamp)
  .First();

答案 2 :(得分:1)

为了获得最佳性能,您根本不应该使用LINQ。二进制搜索给出了LINQ可以提供的O(n)的性能O(log n)intead。

为您的类型创建比较器:

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 method

一起使用
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];

答案 3 :(得分:0)

myList.Where(t =&gt; t.Item1&lt; datetime).OrderByDescending(t =&gt; t.Item1).Last();