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#用数字对arraylist进行排序_C#_Sorting_Ienumerable_Icomparer - Fatal编程技术网

C#用数字对arraylist进行排序

C#用数字对arraylist进行排序,c#,sorting,ienumerable,icomparer,C#,Sorting,Ienumerable,Icomparer,您好,我确实需要一个数组排序,它包含以下内容: 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(i

您好,我确实需要一个数组排序,它包含以下内容:

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指令或程序集引用

是我得到的错误…

请尝试:

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();

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


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

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

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);
}

您可以使用自定义比较器

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
    }
}

这是我不久前写的一段代码,我相信有一种更有效的方法,但这确实有效。 要使用它,请包括:

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);
    }
public int-NaturalCompare(字符串x,字符串y)
{
字符串[]x1,y1;
x1=Regex.Split(x.Replace(“,”),“([0-9]+)”);
y1=正则表达式拆分(y.Replace(“,”),“([0-9]+)”);
对于(int i=0;i
如果您正在使用.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);
            }
                );
String[]info=新字符串[5]{“6,j”,“7,d”,“12,s”,“4,h”,“14,s”};
Array.Sort(信息、委托(字符串a、字符串b)
{
int numberA=int.Parse(a.Substring(0,a.IndexOf(','));
int numberB=int.Parse(b.Substring(0,b.IndexOf(','));
字符串stringA=a.Substring(a.IndexOf(',');
stringB=b.Substring(b.IndexOf(',');
如果(numberA>numberB)返回-1;
否则如果(numberA

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

在哪里定义了
AlphanumComparatorFast
?可能是从这里开始的:但实际上您必须实现代码。。。为了让它工作。。。.NET framework中没有内置任何类似的功能。@flaime-这不是.NET framework的一部分。非常感谢,现在我只遇到一个问题,我为我们提供的数组是35大,我如何修改它来处理它??)好的,但当我这样尝试时:
staticvoidmain(string[]args){string[]info=newstring[5]{“6,j”,“7,d”,“12,s”,“4,h”,“14,s”};info.OrderBy(s=>int.Parse(s.Split(',')[0])。ToArray();for(int i=0;i<5;i++)控制台。WriteLine(info[i]);Console.ReadLine();}
它不起作用…?它似乎起作用了,但我现在有一个最后的prolen,它不起作用了,当我把它放在“真正的交易”中时,它是一个35长的数组,可能没有满,并且大约有3-7满。“formatexception未经处理”是错误。@Flaime是的,这是错误处理部分,我将改进答案againgrate这在测试时似乎效果不错,但当我将其实现到“真实”代码时,我确实得到了错误:argumentoutofrangeexception未经用户代码处理(以及更多),但问题似乎是:a=“16,h”和number=“16”我如何解决这个问题(16是它的最高值)??谢谢你的比较器是什么样子的?你能在你的问题中发布一个例子吗?在测试它时,这似乎很有效,但当我将它实现到“真实”代码时,我确实得到了错误:argumentoutofrangeexception未经用户代码处理(还有更多)但问题似乎是:a=“16,h”和number=“16”我如何解决这个问题(16是最高的数字)??谢谢
 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);
            }
                );