Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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#_Sorting_Icomparable - Fatal编程技术网

如何在C#中创建自定义通用数字文本比较器以对数字/字符串列表进行排序?

如何在C#中创建自定义通用数字文本比较器以对数字/字符串列表进行排序?,c#,sorting,icomparable,C#,Sorting,Icomparable,我有一个数字文本列表,我想创建一个通用的自定义比较器逻辑,用C#对这个列表进行排序。例如 您的代码工作正常。东南方。结果: --, N/A, -888, -0.98, 0.00, 100 , --, Jim, Ken, NA, Peter, Smith 问题在于你的假设,“”和“-”在字母后面。因为他们在市场中的地位较低,所以他们排在第一位 这将是一个简单的解决方案。试一试 public int比较(字符串s1、字符串s2) { 双倍数字1,数字2; 变量isS1Numeric=double.

我有一个数字文本列表,我想创建一个通用的自定义比较器逻辑,用C#对这个列表进行排序。例如


您的代码工作正常。东南方。结果:

--, N/A, -888, -0.98, 0.00, 100
, --, Jim, Ken, NA, Peter, Smith
问题在于你的假设,“”和“-”在字母后面。因为他们在市场中的地位较低,所以他们排在第一位

这将是一个简单的解决方案。试一试

public int比较(字符串s1、字符串s2)
{
双倍数字1,数字2;
变量isS1Numeric=double.TryParse(s1,out number1);
var isS2Numeric=double.TryParse(s2,输出编号2);
if(ISS1数字和ISS2数字)
{
如果(number1>number2)返回1;
if(number1
您的比较器到底有什么不起作用?排序顺序在这两种情况下都不符合预期。对,我的意思是您得到了什么,您期望得到什么?对于数字列表,我得到->--,N/A,-888,-0.98,0.00,100,对于字符串列表,我得到->空,-,Jim,Ken,N/A,Peter,Smith,您为什么期望空和“-”最后呢?暂时忘记数字,标准字符串比较将它们放在开头,而不是结尾。
public class NumberTextComparer : IComparer<string>
    {
        public int Compare(string s1, string s2)
        {
            double number1, number2;
            var isS1Numeric = double.TryParse(s1, out number1);
            var isS2Numeric = double.TryParse(s2, out number2);

            if (isS1Numeric && isS2Numeric)
            {
                if (number1 > number2) return 1;
                if (number1 < number2) return -1;
                return 0;
            }

            return isS1Numeric ? 1 : (isS2Numeric ? -1 : String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase));
        }
    }
var comparer = new NumberTextComparer();
var numericSortedListASC = numericList.OrderBy(str => str, comparer);
var stringSortedListASC = stringList.OrderBy(str => str, comparer);
--, N/A, -888, -0.98, 0.00, 100
, --, Jim, Ken, NA, Peter, Smith
    public int Compare(string s1, string s2)
    {
        double number1, number2;
        var isS1Numeric = double.TryParse(s1, out number1);
        var isS2Numeric = double.TryParse(s2, out number2);

        if (isS1Numeric && isS2Numeric)
        {
            if (number1 > number2) return 1;
            if (number1 < number2) return -1;
            return 0;
        }
        if (isS1Numeric)
            return 1;
        if (isS2Numeric)
            return -1;

        bool s1StartsWithLetter = char.IsLetter(s1.FirstOrDefault());
        bool s2StartsWithLetter = char.IsLetter(s2.FirstOrDefault());

        if (s1StartsWithLetter == s2StartsWithLetter)
            return String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase);
        return s1StartsWithLetter ? -1 : 1;
    }