Как отсортировать список строк чисел в c # [duplicate]

Вы должны вызывать myIntegerObject.toString (), если вам требуется представление строки.

-1
задан Alexei Levenkov 2 June 2016 в 00:45
поделиться

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();
        }
    }
}
5
ответ дан Fredou 15 August 2018 в 23:24
поделиться
  • 1
    Не пришло мне в голову. Когда я прочитал о классе версии, мне показалось, что мне нужно сравнивать только между двумя объектами – Jack Le 2 June 2016 в 04:12

Стандартное решение для сортировки OrderBy, как показано в Как я могу заказать List & lt; string & gt;? , должен работать в этом случае, вы просите его заказать по Version:

 var listOfStrings = new List<string>{"1.2", "2.3", "0.1"};
 listOfStrings = listOfStrings.OrderBy(x => new Version(x)).ToList();
5
ответ дан Community 15 August 2018 в 23:24
поделиться
  • 1
    Я никогда не думал использовать List & lt; Version & gt; вместо List & lt; string & gt ;. Мне нужно больше думать за пределами коробки. благодаря – Jack Le 2 June 2016 в 04:08

вы можете использовать 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;
        }
    }
}
1
ответ дан jdweng 15 August 2018 в 23:24
поделиться
  • 1
    Я думаю, что это слишком сложно для чего-то подобного – Jack Le 2 June 2016 в 04:09
  • 2
    Только потому, что есть метод версии. Это хороший пример того, как создать собственный метод IComparable с использованием метода CompareTo (). – jdweng 2 June 2016 в 06:40

Вы должны использовать 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;
    }
1
ответ дан Trần Anh Nam 15 August 2018 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: