gpt4 book ai didi

c# - 在日期范围内匹配的字典键

转载 作者:行者123 更新时间:2023-11-30 14:03:51 24 4
gpt4 key购买 nike

我想使用匹配日期范围的键将数据存储在通用字典中。

例如,我想出了以下想法

public class MyKey : IEquatable<MyKey> 
{
public int Key { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }

public override int GetHashCode()
{
returns Key;
}

// if there is overlap in date range consider them equal
public bool Equals(MyKey other)
{
if (Key!=other.Key)
return false;
else if(other.StartDate >=StartDate && other.StartDate <=EndDate)
return true;
else if(other.EndDate >=StartDate && other.EndDate <=EndDate)
return true;
else if(StartDate >=other.StartDate && StartDate <=other.EndDate)
return true;
else if(EndDate >=other.StartDate && EndDate <=other.EndDate)
return true;
else
return false;
}
}

然后我会这样使用字典

var dict = new Dictionary<MyKey,MyClass>();
Populate(dict);

// get an element where the current date is in the daterange of the key
// in the collection
var key = new MyKey();
key.Key=7;
key.StartDate=DateTime.Now;
key.EndDate=key.StartDate;

// retrieve the matching element for the date
var myclass = dict[key];

这是我能想到的最好的方法,但是这样做似乎很笨拙。我想添加第四个属性,称为选择日期。并会在字典的条目中将其设置为 null,但会在 Equals 方法中的查找期间使用它。

我想知道是否还有其他人想出一个优雅的解决方案来解决这个问题?

我应该提到,我将首先匹配键,然后可能有特定键属性的日期范围。

最佳答案

您对 Equals 的实现违反了 guidelines for overriding Equals .特别是您的实现不满足传递性规则:

  • if x.Equals(y) && y.Equals(z) returns true, then x.Equals(z) returns true.

违反此准则是一个坏主意,可能会导致问题和困惑。我建议您不要这样做。

我会完全避免将间隔存储为字典中的键。如果愿意,您可以将特定键的间隔列表作为字典中的,但它不应该是键的一部分。

当您搜索间隔时,您可以先使用字典键获取该键的间隔列表,然后遍历间隔以找到与您的参数重叠的间隔。如果特定键的间隔不重叠,那么您可以对它们进行排序并使用二进制搜索来查找特定间隔。如果特定键的间隔可以重叠,您可以查看其他数据结构,例如 interval tree .

相关问题

关于c# - 在日期范围内匹配的字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com