搜索有序LINQ查询的结果

时间:2010-11-11 20:44:23

标签: c# 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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

如果您的数据集已预先排序或者您不知道序列的开始日期,那么二进制搜索可能会更好。但是,如果您使用OrderBy对日期进行排序,并且您知道序列的开始日期,为什么不在订购序列之前将Where子句放入过滤掉不符合条件的日期?

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

答案 1 :(得分:0)

如果您已在sortedData集合中对日期IEnumerable进行了排序,那么您可以在此处获取比第一个日期的阈值更晚的选择日期:

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

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

请注意,它是IEnumerate,因此您可以获得延迟加载的所有好处