更新的强调问题
我有一个包含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))应该在集合中唯一找到一个项目
我不能使用对象的哈希,因为搜索参数对象是具有日期范围的可变对象,并且范围不一定是连续的,至少我不知道如何获得这样的哈希值对象
我完全理解需要匹配的算法,正如我上面提到的,我肯定需要更改我的数据结构并且字典不适合。我的问题非常具体到数据结构的设计,以提高搜索的复杂性。
答案 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)
);