您好我想要一个排序数组,其中包含:
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 :(得分: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();
答案 1 :(得分:2)
您可以解析它们并将它们分成一个类,而不是将它们表示为字符串。实现IComparable并且您已经排序。双关语完全打算。
或者,实现自己的排序比较器来解析对象,然后对它们进行正确排序。
答案 2 :(得分: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());
答案 3 :(得分: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);
}
);
这假定分隔符始终是逗号,如果需要,请添加自己的验证代码。
答案 4 :(得分: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);
}
答案 5 :(得分: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);
}