2010-11-11 117 views
1

我的LINQ查询返回一个有序的日历日期序列,我需要从最早的日期开始输出这个序列,这个序列的开始日期与给定的天数不同。搜索有序的LINQ查询结果

下面的代码使用线性搜索。似乎我可以使用二进制搜索来查找LINQ查询支持的开始日期。

在这个人为的例子中,我可以搜索列表,但在我的真实代码中,我试图避免将整个序列存储在内存中,我更愿意使用IEnumerable。

任何想法如何使它更有效率?我有上千项在我的查询和做线性搜索只是跛脚...

感谢 康斯坦丁


using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace consapp 
{ 
    static class Program 
    { 
     static void Main(string[] args) 
     { 
      var dates = new List<DateTime>(); 
      var xs = dates.OrderBy(x => x); 

      dates.Add(DateTime.Parse("11/10/11")); 
      dates.Add(DateTime.Parse("02/02/11")); 
      dates.Add(DateTime.Parse("11/24/11")); 
      dates.Add(DateTime.Parse("09/09/11")); 
      dates.Add(DateTime.Parse("11/10/11")); 

      var d = DateTime.MinValue; 
      double offset = 1.2; 

      foreach (var x in xs) 
      { 
       if (d != DateTime.MinValue) 
       { 
        offset -= (x - d).Days; 
       } 
       if (offset < 1) 
       { 
        Console.WriteLine(x.ToShortDateString()); 
       } 
       d = x; 
      } 
     } 
    } 
} 

回答

3

二进制搜索可能会更好,如果你的数据集是预先排序,也可以没有提前知道序列的开始日期。但是,如果您使用OrderBy对您的日期进行排序(如您的示例),并且您知道序列的开始日期,那么为什么不在您订购序列之前放入Where子句以过滤出不符合标准的日期?

var xs = from date in dates 
     where (date - target).Days < 1.2 
     order by date 
     select date; 
+0

的应该是好处“其中(日期 - 目标).Days> = Math.Truncate(偏移)” – akonsu 2010-11-11 21:08:24

0

如果你已经整理日期的IEnumerable在sortedData集合,然后在这里你怎么可以在以后得到选择日期比从第一日期门槛:

var threshold = TimeSpan.FromDays(1); 
var filteredDates = sortedDates.SkipWhile(sd => sd - sortedDates.First() <= theshold); 

它具有优势.Where它只需要检查第一个日期,直到达到阈值。之后,它只是枚举元素。

请注意,这是IEnumerate,所以你得到所有懒加载