Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SortedList的动态键<;关键、价值>;_C# - Fatal编程技术网

C# SortedList的动态键<;关键、价值>;

C# SortedList的动态键<;关键、价值>;,c#,C#,我正在上下面的课 如你所见,数字12在列表中有两次 我的问题是,我不知道键使用什么数据类型,也不知道如何访问MyDictionary中的值以满足新的要求 有什么想法吗 自2016年2月24日起的修改: 我必须在原来的问题上再补充一点信息 粒度仅在运行时已知 通过数组索引器[]访问值必须经过运行时优化。它将在很短的时间内被调用数百万次 使用MyDictionary的类使用DateTime对象访问值。例如: public类ClientClass { public void AccessMyDict

我正在上下面的课

如你所见,数字12在列表中有两次

我的问题是,我不知道
键使用什么数据类型,也不知道如何访问
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
    。查询是什么样子的?你能给我举个例子吗?非常感谢你的建议。看起来不错,但我还不知道编译时的粒度。仅在运行时。但你不可能知道这一点见我对原问题的修改。不过,我可能会在最终解决方案中使用您的一些想法。谢谢非常感谢你的建议。看起来不错,但我还不知道编译时的粒度。仅在运行时。但你不可能知道这一点见我对原问题的修改。不过,我可能会在最终解决方案中使用您的一些想法。谢谢