C# SortedList的动态键<;关键、价值>;
我正在上下面的课 如你所见,数字12在列表中有两次 我的问题是,我不知道C# SortedList的动态键<;关键、价值>;,c#,C#,我正在上下面的课 如你所见,数字12在列表中有两次 我的问题是,我不知道键使用什么数据类型,也不知道如何访问MyDictionary中的值以满足新的要求 有什么想法吗 自2016年2月24日起的修改: 我必须在原来的问题上再补充一点信息 粒度仅在运行时已知 通过数组索引器[]访问值必须经过运行时优化。它将在很短的时间内被调用数百万次 使用MyDictionary的类使用DateTime对象访问值。例如: public类ClientClass { public void AccessMyDict
键使用什么数据类型,也不知道如何访问MyDictionary
中的值以满足新的要求
有什么想法吗
自2016年2月24日起的修改:
我必须在原来的问题上再补充一点信息
粒度仅在运行时已知
通过数组索引器[]
访问值必须经过运行时优化。它将在很短的时间内被调用数百万次
使用MyDictionary
的类使用DateTime
对象访问值。例如:
public类ClientClass
{
public void AccessMyDictionary(日期时间日期)
{
MyData data=MyDictionary[date.Year];
//处理数据
}
}
在我看来,最明显的做法是将DateTime
作为索引器数据类型。然后在MyDictionary
类中创建一个索引器来考虑粒度。例如:
2014-12
2015-01
2015-02
...
2015-12
公共枚举周期
{
每年,
每季的
月刊
每周,
每日的
}
公共类MyDictionary
{
私人时期;
私人分类名单;
公共MyDictionary(句点)
{
这个周期=周期;
sortedList=新的sortedList();
}
公共MyData this[日期时间i]
{
得到
{
//在这里实现一个粒度算法,类似于第一个答案中Tomas Lycken的算法
}
设置
{
//在这里实现一个粒度算法,类似于第一个答案中Tomas Lycken的算法
}
}
}
你觉得怎么样?运行时优化了吗
非常感谢
Konstantin我将为各种粒度定义一些新的值对象,所有这些对象都来自一个公共基类Period
。然后,您可以将其用作这些键。比如说,
public abstract class Period { }
public class Quarter : Period
{
public int Quarter { get; }
public int Year { get; }
public Quarter(int year, int quarter)
{
if (year < 1800 || year > DateTime.UtcNow.Year)
{
throw new ArgumentOutOfRangeException(nameof(year));
}
if (quarter < 1 || quarter > 4)
{
throw new ArgumentOutOfRangeException(nameof(quarter));
}
Year = year;
Quarter = quarter;
}
}
根据您将如何使用这些工具,您可能也希望这样做
现在,这些类型可以完全用作字典中的键,因此您可以
var quarterlyReport = new SortedList<Quarter, Data>();
并将其传递给排序列表的构造函数:
var quarterlyData = new SortedList<Quarter, MyData>(new QuarterComparer());
var quarteryData=new SortedList(new QuarterComparer());
我将为各种粒度定义一些新的值对象,所有这些对象都来自一个公共基类Period
。然后,您可以将其用作这些键。比如说,
public abstract class Period { }
public class Quarter : Period
{
public int Quarter { get; }
public int Year { get; }
public Quarter(int year, int quarter)
{
if (year < 1800 || year > DateTime.UtcNow.Year)
{
throw new ArgumentOutOfRangeException(nameof(year));
}
if (quarter < 1 || quarter > 4)
{
throw new ArgumentOutOfRangeException(nameof(quarter));
}
Year = year;
Quarter = quarter;
}
}
根据您将如何使用这些工具,您可能也希望这样做
现在,这些类型可以完全用作字典中的键,因此您可以
var quarterlyReport = new SortedList<Quarter, Data>();
并将其传递给排序列表的构造函数:
var quarterlyData = new SortedList<Quarter, MyData>(new QuarterComparer());
var quarteryData=new SortedList(new QuarterComparer());
如果您的目的是根据上述标准对数据进行排序,我觉得您应该使用列表而不是排序列表,然后公开一种基于参数进行排序的方法。为什么不直接使用DateTime
作为键?然后,您可以根据您的查找要求(例如年、月等)进行查询。Hi@derape,我喜欢数据类型为DateTime
。查询是什么样子的?你能给我举一个例子吗?如果你的目的是根据上述标准对数据进行排序,我觉得你应该使用列表而不是排序列表,然后公开一个基于参数进行排序的方法。为什么不使用DateTime
作为键呢?然后,您可以根据您的查找要求(例如年、月等)进行查询。Hi@derape,我喜欢数据类型为DateTime
。查询是什么样子的?你能给我举个例子吗?非常感谢你的建议。看起来不错,但我还不知道编译时的粒度。仅在运行时。但你不可能知道这一点见我对原问题的修改。不过,我可能会在最终解决方案中使用您的一些想法。谢谢非常感谢你的建议。看起来不错,但我还不知道编译时的粒度。仅在运行时。但你不可能知道这一点见我对原问题的修改。不过,我可能会在最终解决方案中使用您的一些想法。谢谢