2012-01-16 33 views
2

你好,我也希望有一个排序的数组,包含此:C#排序与人物的ArrayList

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

是我的错误...

+0

哪里是'AlphanumComparatorFast'定义? – 2012-01-16 21:21:01

+4

它可能是从这里开始的:http://www.dotnetperls.com/alphanumeric-sorting但实际上你必须实现这个代码......因为它能够工作...... .NET框架没有像它那样内置的东西。 – 2012-01-16 21:23:32

+0

@flaimme - 这不是.net框架的一部分。 – 2012-01-16 21:24:18

回答

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

我会给一个额外的+1,以鼓励准确的错误处理,如果我可以.. – 2012-01-16 21:27:46

+0

非常感谢现在我只有一个问题,我做我们的阵列是35大,我怎么能修改这个工作呢? :) – flaimme 2012-01-16 21:34:25

+0

@flaimme我没有得到数组的大小将如何改变这一结果...... – 2012-01-16 21:51:20

2

而不是代表这些字符串,你可以解析它们,并将它们拆分出来成为一个班级。实现IComparable,你是排序。潘完全打算。

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

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); 
} 
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()); 
+0

grate当测试它时,它似乎工作得很好,但是当我将它实现为“真实”代码ii时出现错误:argumentoutofrangeexception was unhandled通过用户代码(和更多),但问题似乎是:a =“16,h”和数字=“16”我该如何解决这个问题(和16是最高数量它来)?谢谢 – flaimme 2012-01-16 22:09:22

+0

你的比较器是什么样的?你可以在你的问题中发布一个样本吗? – 2012-01-16 22:13:01

+0

ops我没有注册以回答Andrzej Nosal ops ... – flaimme 2012-01-16 22:16:09

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

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

+0

grate这看起来在测试它时表现很好,但是当我将它实现为“真实”代码ii时出现错误:argumentoutofrangeexception未被用户代码处理和更多),但问题似乎是:a =“16,h”和数字=“16”我该如何解决这个问题(16是最高的数字来)?谢谢 – flaimme 2012-01-16 22:15:13