C # сортировка массива с цифрами - PullRequest
2 голосов
/ 17 января 2012

Здравствуйте, я хочу отсортировать массив, который содержит это:

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 или ссылка на сборку

- это ошибка, котораяя понимаю ...

Ответы [ 6 ]

11 голосов
/ 17 января 2012

попробуй с:

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 голосов
/ 17 января 2012

Если вы используете .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);
            }
                );

Предполагается, что разделитель всегда является запятой, при необходимости добавьте свой собственный код проверки.

2 голосов
/ 17 января 2012

вы можете использовать пользовательский компаратор

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());
2 голосов
/ 17 января 2012

Вместо того, чтобы представлять их как строки, вы можете проанализировать их и разделить на классы. Внедрите IComparable, и вы отсортированы. Пан полностью предназначен.

Или создайте собственный компаратор сортировки, чтобы проанализировать объекты и затем правильно их отсортировать.

1 голос
/ 17 января 2012

Вот немного кода, который я написал некоторое время назад, я уверен, что есть более эффективный способ сделать это, но это, безусловно, работает. Чтобы использовать его, включите:

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);
    }
1 голос
/ 17 января 2012

Сортировка по числовой части строки:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...