2

您好,我确实想要一个数组,其中包含:

String[] info = new String[5]{"6,j", "7,d", "12,s", "4,h", "14,s" };

但如果我使用这个:

Array.Sort(info);

输出变为:

"7,d"
"6,j"
"4,h"
"14,s"
"12,s"

但我不会输出是:

"14,s"
"12,s"
"7,d"
"6,j"
"4,h"

在/使用 C# 中最简单的方法是什么?

当我这样做时,我无法让字母数字排序工作:

Array.Sort(info, new AlphanumComparatorFast());

找不到类型或命名空间“AlphanumComparatorFast”您是否缺少 using 指令或程序集引用

是我得到的错误...

4

6 回答 6

11

尝试:

var sortedArray = info.OrderBy(s=>int.Parse(s.Split(',')[0])).ToArray();

这仅按数字部分排序,但您可以详细说明该示例。这段代码强烈假设总是有逗号分隔符,这可能是生产中的一个问题,做一些更准确的错误处理。如果数组包含一些不符合异常的元素,假设忽略失败元素是可以接受的,我们可以写:

 var sortedArray = info.Where(k=>!string.IsNullOrEmpty(k)&&k.IndexOf(",")!=-1)
.OrderBy(s=>int.Parse(s.Split(',')[0])).ToArray();
于 2012-01-16T21:24:07.687 回答
2

您可以解析它们并将它们拆分为一个类,而不是将它们表示为字符串。实施 IComparable 并排序。双关语完全有意。

或者,实现您自己的排序比较器来解析对象,然后对它们进行正确排序。

于 2012-01-16T21:24:24.880 回答
2

您可以使用自定义比较器

public class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // return value greater than zero if x is greater than y
        // return zero if x is equal to y
        // return value less than zero if x is less than y
    }
}

你可以像这样使用你的比较器

Array.Sort(info, new MyComparer());
于 2012-01-16T21:28:42.027 回答
2

如果您使用的是 .NET 2.0 并且无法使用 Linq,您可以尝试:

 String[] info = new String[5] { "6,j", "7,d", "12,s", "4,h", "14,s" };
            Array.Sort(info, delegate(string a, string b)
            {
                int numberA = int.Parse(a.Substring(0, a.IndexOf(',')));
                int numberB = int.Parse(b.Substring(0, b.IndexOf(',')));

                string stringA = a.Substring(a.IndexOf(','));
                string stringB = b.Substring(b.IndexOf(','));

                if (numberA > numberB) return -1;
                else if (numberA < numberB) return 1;
                else return stringA.CompareTo(stringB);
            }
                );

这假定分隔符始终是逗号,如果需要,请添加您自己的验证码。

于 2012-01-16T21:34:40.813 回答
1

对字符串的数字部分进行排序:

var info = new String[5]{"6,j", "7,d", "12,s", "4,h", "14,s" };
foreach (var item in info.OrderByDescending (x => 
                                   int.Parse(x.Substring(0, x.IndexOf(',')))))
{
    Console.WriteLine(item);
}
于 2012-01-16T21:26:23.020 回答
1

这是我不久前写的一些代码,我确信有一种更有效的方法可以做到这一点,但这确实有效。要使用它,包括:

using System.Linq;

然后调用使用 linq 查询:

Array.Sort(info,delegate(string x, string y){return NaturalCompare(y,x)}); sort as you seem to want

当然还包括相关方法:

    public int NaturalCompare(string x, string y)
    {
        string[] x1, y1;
        x1 = Regex.Split(x.Replace(" ", ""), "([0-9]+)");
        y1 = Regex.Split(y.Replace(" ", ""), "([0-9]+)");
        for (int i = 0; i < x1.Length && i < y1.Length; i++)
        {
            if (!x1[i].Equals(y1[i]))
            {
                return PartCompare(x1[i], y1[i]);
            }
        }
        return x.CompareTo(y);
    }

    private int PartCompare(string left, string right)
    {
        int x, y;
        if (int.TryParse(left, out x) && int.TryParse(right, out y))
            return x.CompareTo(y);
        return left.CompareTo(right);
    }
于 2012-01-16T21:31:18.433 回答