Сортировка коллекции Arraylist с элементами в виде строк - PullRequest
0 голосов
/ 04 марта 2019

У меня есть список массивов, который состоит из таких элементов, как: M1, M2, M3 ... M9, M10, M11 и так далее.Когда я сортировал элементы, используя встроенную функцию сортировки, M10 и M11 помещаются в 2-ю и 3-ю позиции соответственно после M1 .

Есть ли в любом случае, чтобы отсортировать, где мне нужно M10 и M11 , чтобы прийти после M9 ?

Ответы [ 5 ]

0 голосов
/ 04 марта 2019

OrderBy с пользовательским IComparer может быть полезным.Попробуйте это:

var list = new List<string> { "M10", "M2", "M9", "M1", "M22" };
Console.WriteLine(string.Join(", ", list.OrderBy(_ => _, new Comparer())));
// M1, M2, M9, M10, M22

Где пользовательский IComparer<string> может быть реализован так:

class Comparer : IComparer<string>
{
    public int Compare(string x, string y) 
        => x.Length != y.Length ? x.Length - y.Length : string.Compare(x, y);
}
0 голосов
/ 04 марта 2019

Вот, пожалуйста, без каких-либо внешних пакетов:

     class Program
  {
    static void Main(string[] args)
    {
      // Initializing your list of strings
      List<string> list = new List<string>()
      {
        "M9", "M2", "M7", "M11", "M5", "M6", "M3", "M8", "M1", "M10", "M4", "M12"
      };

      SortStringList(list);
    }

    private static void SortStringList(List<string> list)
    {
      // Bubble sort
      bool change = true;

      while (change)
      {
        change = false;
        for (int i = 0; i < list.Count; i++)
        {
          if (i + 1 < list.Count)
          {
            // here im converting the string to a number removing the first char "M"
            int currentElement = Convert.ToInt32(list[i].Remove(0, 1));
            int nextElement = Convert.ToInt32(list[i + 1].Remove(0, 1));
            // comparing two integers and swapping the strings elements
            if (currentElement > nextElement)
            {
              string tmp = list[i];
              list[i] = list[i + 1];
              list[i + 1] = tmp;
              change = true;
            }
          }
        }
      }
    }
  }
0 голосов
/ 04 марта 2019

аналогичные вопросы и некоторые принятые решения можно найти по ссылке ниже

c # linq порядковые числа, которые являются строковыми (и вы не можете преобразовать их в int)

0 голосов
/ 04 марта 2019

То, что вы пытаетесь сделать, называется Естественная сортировка
Существует NuGet пакет для .Net реализации

Затем вы можете отсортировать массивочень просто

arr.OrderBy(x => x, StringComparer.OrdinalIgnoreCase.WithNaturalSort());
0 голосов
/ 04 марта 2019

Вы можете использовать IComparable для реализации пользовательской сортировки для вашего класса.По сути, IComparable позволяет настраивать сортировку объектов при реализации.

Просто отметьте следующее Пример :

class Employee : IComparable<Employee>
{
public int Salary { get; set; }
public string Name { get; set; }

public int CompareTo(Employee other)
{
    // Alphabetic sort if salary is equal. [A to Z]
    if (this.Salary == other.Salary)
    {
        return this.Name.CompareTo(other.Name);
    }
    // Default to salary sort. [High to low]
    return other.Salary.CompareTo(this.Salary);
}
}

С уважением.

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