C # сортировка списка, логическое сравнение - PullRequest
2 голосов
/ 01 июля 2010

У меня есть следующая проблема У меня есть список со строками, например (100_1, 100_2 ...., 100_10)

Я сортирую список с помощью следующего кода

extraImgsRaw.Sort((photo1, photo2) => photo1.CompareTo(photo2));

В результате получается: 100_1, 100_10, 100_2, 100_3 и т. д.

. Я хочу получить логическое сравнение, например 100_1, 100_2, а затем 100_10, поэтому я предпочитаю натуральную числовую сортировку, а не алфавитную сортировку.Нужно ли мне писать свой собственный класс сравнения, который реализует интерфейс ICompare, или в LINQ есть метод сборки, который делает это?

заранее спасибо

Ответы [ 2 ]

4 голосов
/ 01 июля 2010

Нет ничего встроенного, но если данные точно такие, как показано в вашем вопросе, тогда не составит труда собрать Comparison<T>, чтобы сделать это для вас:

extraImgsRaw.Sort((x, y) =>
                  {
                      // error checking etc removed for brevity
                      int[] xi = x.Split('_').Select(int.Parse).ToArray();
                      int[] yi = y.Split('_').Select(int.Parse).ToArray();

                      int c = xi[0].CompareTo(yi[0]);
                      return (c != 0) ? c : xi[1].CompareTo(yi[1]);
                  });
1 голос
/ 01 июля 2010

Разделение и сравнение элементов,

Вот один, который я написал для «версий».

  /// <summary>
  /// Only works for version numbers in the form a ( . b ( . c ( . d )? )? )?
  /// </summary>
  public class VersionComponents : IComparable<VersionComponents>
  {
    readonly int[] components;

    int[] GetComponents(string cpnumber)
    {
      var tokens = cpnumber.Split(".".ToCharArray(), 
                                   StringSplitOptions.RemoveEmptyEntries);
      return tokens.Select(x => Convert.ToInt32(x)).ToArray();
    }

    public VersionComponents(string cpnumber)
    {
      components = GetComponents(cpnumber);
    }

    public int this[int index]
    {
      get { return components.Length > index ? components[index] : 0; }
    }

    public int CompareTo(VersionComponents other)
    {
      for (int i = 0; i < components.Length || 
                      i < other.components.Length; i++)
      {
        var diff = this[i].CompareTo(other[i]);
        if (diff != 0)
        {
          return diff;
        }
      }

      return 0;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...