基于日期时间值是否落在范围内的高效搜索

时间:2017-03-17 21:12:26

标签: c# dictionary search

更新的强调问题

我有一个包含DateTime值列表的对象。这是假期列表以及一天中的工作时间。

Item.cs

class Item
{
    public int SourceId { get; set; }
    public int DestinationId { get; set; }
    public int ChannelId { get; set; }
    public string Username { get; set; }
    public List<DateTime> Holidays { get; set; }
}

如果不是假期,我们可以将字典作为关键字保存在字典中。

要求

将有一个项目符合条件(因为没有项目匹配时有一个默认项目来处理案例)

属性意味着时不时地改变

1)是否可以获得包含Holidays属性的对象的哈希码。

2)如果不是字典,如何设计具有最佳时间复杂度的搜索的数据结构

原帖不清楚

我实现了一个以元组为键的字典,它一直运用到现在。

现有字典键

Tuple<int, int, int, string>

现有搜索方法

var item = default(item);
_dictinary.TryGetValue(new Tuple(1,1,1,""), out item);
return item;

因为搜索参数是固定的。

然而,现在出现了一个新的要求,即元组项是动态的,即搜索参数的数量可变。我试图通过假设总是有最大数量的搜索参数来保持数字固定,但是当另一个类型为日期范围的搜索参数作为要求时我碰到了墙。这意味着我不能将字典作为底层数据结构。

因此,当有多个标准与日期范围等内容时,我需要知道有人会考虑采用何种数据结构来尽可能保持搜索效率。

为了完整起见,我想说新的搜索参数是一个日期范围,名为Holiday。即如果今天是在该假日的日期范围内,我需要匹配,包括其他参数

Holiday.cs

public class Holiday
{
    public List<Day> Days{ get; set; }
}

其中Day是DateTime的包装,表示一年中的一天。

概要  的组合 SourceId(int),DestinationId(int),ChannelId(int),Username(int),(IsTodayHoliday(Holiday-DateRanges))应该在集合中唯一找到一个项目

我不能使用对象的哈希,因为搜索参数对象是具有日期范围的可变对象,并且范围不一定是连续的,至少我不知道如何获得这样的哈希值对象

我完全理解需要匹配的算法,正如我上面提到的,我肯定需要更改我的数据结构并且字典不适合。我的问题非常具体到数据结构的设计,以提高搜索的复杂性。

1 个答案:

答案 0 :(得分:0)

由于dictionary可用于按键匹配,因此不太灵活, 我建议你使用普通列表和linq:

class Item
{
    int a;
    int b;
    int c;
    string s;
    List<Day> days;
}

class SearchParams
{
    int a;
    int b;
    int c;
    string s;
    Day d1;
    Day d2;
}

// Populate items
var items = new List<Item>();
items.Add(...);

// Search items
var par = new SearchParams { ... };
var matches = items.Where(x=> 
    x.a == par.a &&
    x.b == par.b &&
    x.c == par.c &&
    x.s == par.s &&
    x.days.Any(d >= par.d1 && d <= par.d2)
);