我创建了一个Range类型:
public class Range<T> where T : IComparable<T>
{
public Range(T min, T max) : this(min, max, false) { }
public Range(T min, T max, bool upperbound)
{
}
public bool Upperbound { get; private set; }
public T Min { get; private set; }
public T Max { get; private set; }
public bool Between(T Value)
{
return Upperbound ? (Min.CompareTo(Value) < 0) && (Value.CompareTo(Max) <= 0) : (Min.CompareTo(Value) <= 0) && (Value.CompareTo(Max) < 0);
}
}
我想在字典中使用它作为键,允许我根据范围进行搜索。是的,范围可以重叠或者可能存在间隙,这是设计的一部分。它看起来很简单,但我希望搜索更容易一些!我想比较一个范围与它的类型T的值,所以我可以使用:myRange == 10而不是myRange.Between(10)。
如何? :-) (不想打破这个。我可能会找到答案,但也许我正在重新发明轮子或其他什么。)
一旦我有按范围分组的产品列表,我就可以开始搜索特定范围内的值。基本上,这可能是所有值的字典上的Linq查询,其中提供值介于最小值和最大值之间。
我实际上正在处理两个这样的列表。在一个中,范围是上限而另一个是下限。可能会有更多这类列表,我首先需要根据其范围收集数据,然后在其中查找特定项目。
我可以使用List吗?可能,但是根据范围本身,我不会对数据进行独特的分组。列表列表呢?可能,但后来我再次考虑字典。 : - )
接下来,我从另一个来源获得一个值。例如,我需要找到的值1.12。所以这次我使用Linq搜索字典来查找1.12将在键范围内的所有项目列表。因此,我会找到1到2,1到1.5甚至0到100的范围。在这些范围的后面会有我需要为此值处理的项目列表。然后我可以继续前进到下一个值,大约4000个不同的值。最好一切都应该用5秒完成。
答案 0 :(得分:6)
在字典中使用密钥需要覆盖GetHashCode
和Equals
。基本上你会根据最小值和最大值以及Upperbound创建一个哈希值。通常,您在每个组件上调用GetHashCode
并将它们组合在一起,例如:
public override int GetHashCode()
{
int result = 17;
result = result * 31 + Min.GetHashCode();
result = result * 31 + Max.GetHashCode();
result = result * 31 + Upperbound ? 1 : 0;
}
您还需要进行相等测试。
我不确定你的意思是“允许我根据范围进行搜索”。你能给出一些展示你如何使用这种能力的示例代码吗?我不完全确定它是否符合正常的字典方法......
我建议您不要重载==运算符以允许您使用它进行包含测试。范围不等于范围内的值,因此使用该范围的代码不会非常直观。
(我个人也将Between
重命名为Contains
。)