2016-06-02 2 views
-1

У меня есть список строк версии (см. Фото), и я хотел бы отсортировать их в порядке убывания.Как отсортировать список <string>/массив строки номер версии?

enter image description here

Я видел несколько решений, используя класс Version, чтобы сравнить их, но я не могу думать о любом решении такого рода целый список, как это. Каков наименее сложный способ достичь этого?

+1

«Список ' будет простейшим. Строки, содержащие цифры, не сортируют номера списков. Альтернативно, найдите/используйте Природный Сортировка – Plutonix

+0

Сторона примечания: Пожалуйста, не добавляйте текст «спасибо» и «искать alot» на ваши сообщения. Чтобы продемонстрировать исследовательские усилия, укажите ссылки на подходы, которые вы пробовали, с кратким объяснением, почему оно не решило вашу проблему. –

ответ

4

Что не так с этой простой реализацией?

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var ver = new List<Version>(); 

      ver.Add(new Version("3.5")); 
      ver.Add(new Version("3.15")); 
      ver.Add(new Version("3.10")); 
      ver.Add(new Version("3.1")); 

      ver.Sort(); 
      ver.Reverse(); 
     } 
    } 
} 
+0

Не пришло мне в голову. Когда я читал о классе версии, я думал, что мне нужно сравнивать только между двумя объектами –

4

Стандартная сортировка решение OrderBy в shownd в How can I order a List<string>? должен работать в этом случае вы попросите его заказать по Version:

var listOfStrings = new List<string>{"1.2", "2.3", "0.1"}; 
listOfStrings = listOfStrings.OrderBy(x => new Version(x)).ToList(); 
+0

Я никогда не думал использовать Список вместо списка . Мне нужно больше думать за пределами коробки. Спасибо –

1

вы можете использовать IComparable

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
       List<string> data = new List<string>{ 
       "3.5.0.1", "3.4.1.9", "3.4.1.56", "3.4.1.55", "3.4.1.46", 
       "3.4.1.45", "3.4.1.44", "3.4.1.30", "3.4.1.3", "3.4.1.22", 
       "3.4.1.2", "3.4.1.11", "3.4.1.0", "3.4.0.7", "3.4.0.3", 
       "3.4.0.1", "3.3.0.8", "3.3.0.4", "3.3.0.0", "3.2.0.9", 
       "3.2.0.6", "3.2.0.3", "3.2.0.27", "3.2.0.20", "3.2.0.15", 
       "3.2.0.1", "3.2.0.0", "3.1.0.7", "3.1.0.15", "3.1.0.14" 
       }; 
       List<SortPara> sortPara = data.Select(x => new SortPara(x)).ToList(); 
       data = sortPara.OrderBy(x => x).Select(x => x.strNumbers).ToList(); 
       data = sortPara.OrderByDescending(x => x).Select(x => x.strNumbers).ToList(); 
     } 

    } 
    public class SortPara : IComparable<SortPara> 
    { 
     public List<int> numbers { get; set; } 
     public string strNumbers { get; set; } 
     public SortPara(string strNumbers) 
     { 
      this.strNumbers = strNumbers; 
      numbers = strNumbers.Split(new char[] { '.' }).Select(x => int.Parse(x)).ToList(); 

     } 
     public int CompareTo(SortPara other) 
     { 
      int shortest = this.numbers.Count < other.numbers.Count ? this.numbers.Count : other.numbers.Count; 
      int results = 0; 
      for (int i = 0; i < shortest; i++) 
      { 
       if (this.numbers[i] != other.numbers[i]) 
       { 
        results = this.numbers[i].CompareTo(other.numbers[i]); 
        break; 
       } 
      } 
      return results; 
     } 
    } 
} 
+0

Я думаю, что это слишком много для этого –

+0

Только потому, что есть метод версии. Это хороший пример того, как создать собственный метод IComparable с использованием метода CompareTo(). – jdweng

1

Вы должны использовать IComparable как jdweng, просто немного измените версии, такие как «2.1.0.4» и «2.1»:

public int CompareTo(SortPara other) 
    { 
     int shortest = this.numbers.Count < other.numbers.Count ? this.numbers.Count : other.numbers.Count; 
     int results = 0; 
     for (int i = 0; i < shortest; i++) 
     { 
      if (this.numbers[i] != other.numbers[i]) 
      { 
       results = this.numbers[i].CompareTo(other.numbers[i]); 
       break; 
      } 
     } 
     if (results != 0) 
      return results; 
     if (this.numbers.Count > other.numbers.Count) 
      return 1; 
     else if (this.numbers.Count < other.numbers.Count) 
      return -1; 
     else 
      return 0; 
    } 
Смежные вопросы