Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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#_C#_.net 4.0_Enums_Logic_Sorteddictionary - Fatal编程技术网

分类字典-C#

分类字典-C#,c#,.net-4.0,enums,logic,sorteddictionary,C#,.net 4.0,Enums,Logic,Sorteddictionary,我试图找出如何创建一个排序字典,其中键按非字母顺序排序。有什么方法可以定义我想要的排序方式吗 例如,键的顺序可能如下所示: AAA1X AAB1Y AAC1Y AAA2X AAB2Y AAC2X 虽然前三个字母是按字母顺序排列的,但如果我按原样排序,它会将它们按错误的顺序(由于数字的原因)排列。还要注意的是,末尾有一个X或Y。在代码中,只有X或Y 即使我可以为所有可能组合的排序编写枚举,我也愿意这样做,但我不确定如何使用排序字典和枚举 我知道这有点含糊不清,但任何帮助都将不胜感激 干杯 Sor

我试图找出如何创建一个排序字典,其中键按非字母顺序排序。有什么方法可以定义我想要的排序方式吗

例如,键的顺序可能如下所示:

AAA1X
AAB1Y
AAC1Y
AAA2X
AAB2Y
AAC2X
虽然前三个字母是按字母顺序排列的,但如果我按原样排序,它会将它们按错误的顺序(由于数字的原因)排列。还要注意的是,末尾有一个X或Y。在代码中,只有X或Y

即使我可以为所有可能组合的排序编写枚举,我也愿意这样做,但我不确定如何使用排序字典和枚举

我知道这有点含糊不清,但任何帮助都将不胜感激


干杯

SortedDictionary的一个构造函数采用了一个
IComparer
,您可以在其中指定字典将用于排序的自定义比较器类

public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // do your own comparison however you like; return a negative value
        // to indicate that x < y, a positive value to indicate that x > y,
        // or 0 to indicate that they are equal.
    }
}

...

SortedDictionary<string, object> dict = 
              new SortedDictionary<string, object>(new CustomComparer());
公共类CustomComparer:IComparer
{
公共整数比较(字符串x、字符串y)
{
//按照自己的喜好进行比较;返回负值
//表示xy的正值,
//或0表示它们相等。
}
}
...
分类词典dict=
新的SortedDictionary(新的CustomComparer());

SortedDictionary的一个构造函数接受一个
IComparer
,您可以在其中指定字典将用于排序的自定义比较器类

public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // do your own comparison however you like; return a negative value
        // to indicate that x < y, a positive value to indicate that x > y,
        // or 0 to indicate that they are equal.
    }
}

...

SortedDictionary<string, object> dict = 
              new SortedDictionary<string, object>(new CustomComparer());
公共类CustomComparer:IComparer
{
公共整数比较(字符串x、字符串y)
{
//按照自己的喜好进行比较;返回负值
//表示xy的正值,
//或0表示它们相等。
}
}
...
分类词典dict=
新的SortedDictionary(新的CustomComparer());
您可以:

创建一个封装这些键的类,并重写==运算符、
Object.Equals
方法和
Object.GetHashCode
方法。同时让类实现接口,这样平等规则将自动以正确的方式对键进行排序。现在,您只需将这些键放在or中,它就会自动按您想要的方式排序

实现一个对象,该对象以您想要的方式比较这些字符串,并在构造or时指定IComparer。

您可以:

创建一个封装这些键的类,并重写==运算符、
Object.Equals
方法和
Object.GetHashCode
方法。同时让类实现接口,这样平等规则将自动以正确的方式对键进行排序。现在,您只需将这些键放在or中,它就会自动按您想要的方式排序


实现一个对象,该对象以您想要的方式比较这些字符串,并在构造or时指定IComparer。

您可以自己实现IDictionary并按您想要的方式进行排序。您可以自己实现IDictionary并按您想要的方式进行排序。重载
=
运算符不会有任何作用(请注意,您可以重载运算符,而不是重写,因为运算符不是多态的).实际上,SortedDictionary/SortedList不使用GetHashCode/Equals方法。为了使对象能够被排序,它必须实现
IComparable
。你的术语是正确的。我编辑了我的原始答案。对于第一种方法,封装类必须实现IComparable接口。如果凯恩斯主义ss正在涉入这一领域,最好彻底覆盖Equals和GetHashCode。他还应该重载==因为他希望包含的类像字符串一样工作。例如,如果它们具有相同的字符串内容,则obj_a==obj_b。重载
==
操作符不会起任何作用(请注意,您可以重载运算符,而不是重写,因为运算符不是多态的).实际上,SortedDictionary/SortedList不使用GetHashCode/Equals方法。为了使对象能够被排序,它必须实现
IComparable
。你的术语是正确的。我编辑了我的原始答案。对于第一种方法,封装类必须实现IComparable接口。如果凯恩斯主义ss正在涉入这一领域,最好彻底覆盖Equals和GetHashCode。他还应该重载==因为他希望包含的类像字符串一样工作。例如,如果它们具有相同的字符串内容,则obj_a==obj_b。