C# SortedSet和SortedList使用不同的枚举失败

C# SortedSet和SortedList使用不同的枚举失败,c#,session,sorting,enums,C#,Session,Sorting,Enums,整个故事;我有一些KeyValuePairs需要存储在会话中,我的主要目标是保持它的小型化。因此,我没有选择使用许多不同的集合。虽然键是不同枚举类型的不同枚举值,但该值始终只是相同枚举类型的枚举值。我为这种方法选择了一个哈希表,其内容如下所示(更多): 我最多只能在该哈希表上运行contains,但可以肯定的是,我还需要在某个点获取该值,并且需要遍历所有元素。这一切都很好,但现在我有一个新的要求,以保持顺序,我已将它们添加到哈希表->BANG 哈希表是一个映射,这是不可能的 现在我考虑使用一个S

整个故事;我有一些KeyValuePairs需要存储在会话中,我的主要目标是保持它的小型化。因此,我没有选择使用许多不同的集合。虽然键是不同枚举类型的不同枚举值,但该值始终只是相同枚举类型的枚举值。我为这种方法选择了一个哈希表,其内容如下所示(更多):

我最多只能在该哈希表上运行contains,但可以肯定的是,我还需要在某个点获取该值,并且需要遍历所有元素。这一切都很好,但现在我有一个新的要求,以保持顺序,我已将它们添加到哈希表->BANG

哈希表是一个映射,这是不可能的

现在我考虑使用一个
SortedList
,或者使用更多的数据,但查找速度稍微快一点,并在哈希表之外使用一个
SortedSet

以下内容已编辑

SortedList实现为

SortedList<Enum, MyEnum> mySortedList = new SortedList<Enum, MyEnum>();
SortedSet<Enum> mySortedSet = new SortedSet<Enum>();
对于像这样的分拣机

void AddPair(Enum key)
{
    mySortedSet.Add(key);
}
两者都失败了,只有一个例外:

对象的类型必须与 枚举

我的问题是:哪里出了问题?我如何归档我的目标

使用过的解决方案

我已经决定接受生活中的不利因素 针对速度较慢的系统配置冗余数据 查找并决定实施
列表
将保留 插入与我的订单平行的订单 现有哈希表

就我而言,我只有大约50-150个 元素,所以我决定对
哈希表
针对
列表

因此我创造了我自己 要实现的以下帮助程序
ContainsKey()
列表

静态bool ContainsKey(此列表,对象键)
{
foreach(列表中的KeyValuePair p)
{
如果(p.Key.等于(Key))
返回true;
}
返回false;
}
我插入了同样的100个条目,然后 随机检查十个中的一个 循环中的不同条目。 而且。。。差别很小,所以我 我决定和你一起去
列表


我认为您应该将数据存储在
列表
字典
的实例中

SortedSet
SortedList
是通用的,但是您的键是EnumTypeA/EnumTypeB,您需要使用它们的基类(System.Enum)指定通用的T,如下所示:


顺便说一句,我想你需要获得“插入订单”?如果是这样,
List
是一个更好的选择,因为
SortedSet
将防止重复项目。

@Danny更改
SortedList
SortedSet
不会更改错误。字典或列表是否获得插入顺序?@Danny问题中解释了这一点;异常表示对象必须与枚举I的类型相同,虽然用法应该很明显,但我会在注释“不幸的是,Comparer.Default没有明智地实现。如果两个枚举不是同一类型,它会引发异常。”之后添加一些代码。为什么说这是不明智的?我想不出更好的行为,因为没有合理的方式来订购不同的类型。你的比较器不正确。它需要一个插入时间戳,而不是基于枚举的值。创建一个包装类,例如
{Enum,DateTime}
@sra:您不是根据值排序,而是根据您将它们添加到列表中的方式排序。因此,它需要某种形式的时间戳。在我看来,如果列表很小,只需使用
list
,那么你就不必担心这些额外的麻烦了。
void AddPair(Enum key, MyEnum value)
{
    mySortedList.Add(key, value);
}
void AddPair(Enum key)
{
    mySortedSet.Add(key);
}
static bool ContainsKey(this List<KeyValuePair<object, object>> list, object key)
{
    foreach (KeyValuePair<object, object> p in list)
    {
        if (p.Key.Equals(key))
            return true;
    }
    return false;
}
SortedList<Enum, MyEnum> sorted = new SortedList<Enum, MyEnum>();
class EnumComparer : IComparer<Enum>
{
    public int Compare(Enum x, Enum y)
    {
        return x.GetHashCode() - y.GetHashCode();
    }
}

var sorted = new SortedList<Enum, MyEnum>(new EnumComparer());