C# 包含范围编号的字符串的排序列表

C# 包含范围编号的字符串的排序列表,c#,sorting,C#,Sorting,任何人都可以帮助建立一个逻辑来对包含范围数字项的字符串列表进行排序 例如:List myList=newlist(){“1”、“3-6”、“2”、“8-10”、“7”、“11”、“13-18”、“12”} 已排序的输出列表: 1. 2. 3-6, 7. 8-10, 11, 12, 13-18 注: 列表只包含正数 谢谢, Arjun基本步骤是: 现在有一种方法可以做到: using System; using System.Collections.Generic; using Syst

任何人都可以帮助建立一个逻辑来对包含范围数字项的字符串列表进行排序

例如:List myList=newlist(){“1”、“3-6”、“2”、“8-10”、“7”、“11”、“13-18”、“12”}

已排序的输出列表: 1. 2. 3-6, 7. 8-10, 11, 12, 13-18

注: 列表只包含正数

谢谢, Arjun

基本步骤是:

现在有一种方法可以做到:

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

public class Program
{
    static void Main(string[] args)
    {
        var myList = new List<string> { "1", "3-6", "2", "8-10", "7", "11", "13-18", "12" };
        var ranges = myList.Select(x=> new Range(x)).ToList();
        ranges.Sort();//Order yourself!

        //Display
        foreach (var range in ranges) Console.WriteLine(range);

        //One line with comma separator
        Console.WriteLine(string.Join(", ", ranges));
    }

    public class Range : IComparable<Range>
    {
        // Simple ctor, with Customisable separator in case of Negative Value. 
        public Range(string input, char separator= '-') {
            if (!input.Contains(separator))// Is it a range?
            {//It's not then
                if (int.TryParse(input, out int value))// Lets try to convert it to an integer
                {// it's a int then
                    Min = value; Max = value; // both min and max 
                }
                else
                {// It's not a range and it's not an int! Scream!
                    throw new ArgumentException(input + "  is not a valid input !");
                }
            }
            else 
            {//It's a range
                var parts = input.Split(new char[] { separator }, 2);// split in 2 on the separator
                if (int.TryParse(parts[0], out int part1) && int.TryParse(parts[1], out int part2))// Both part are int? 
                {                        
                    Min = Math.Min(part1, part2); // min is the min and max the max.
                    Max = Math.Max(part1, part2); // It's easier to compute min/max than try to fix a bad input.
                }
                else {// It's look like a range but those are not int! Scream!
                    throw new ArgumentException(input + "  is not a valid input !" );
                }
            }
        }
        public int Min { get; set; }
        public int Max { get; set; }

        // Comparing bound together. {1-1} < {1-2} < {1-6} < {2-2}; 
        public int CompareTo(Range obj)
        {
            var mincomparer = this.Min.CompareTo(obj.Min);
            var maxcomparer = this.Max.CompareTo(obj.Max);
            return mincomparer == 0 ? maxcomparer : mincomparer;
        }

        public override string ToString()
        {
            return Min == Max ? Min.ToString() : Min + "-" + Max;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
静态void Main(字符串[]参数)
{
var myList=新列表{“1”、“3-6”、“2”、“8-10”、“7”、“11”、“13-18”、“12”};
var ranges=myList.Select(x=>newrange(x)).ToList();
ranges.Sort();//自己点!
//展示
foreach(范围中的变量范围)控制台。WriteLine(范围);
//一行逗号分隔符
Console.WriteLine(string.Join(“,”,ranges));
}
公共类范围:i可比较
{
//简单的ctor,在负值的情况下具有可自定义的分隔符。
公共范围(字符串输入,字符分隔符='-'){
如果(!input.Contains(separator))//它是一个范围吗?
{//那时不是
if(int.TryParse(input,out int value))//让我们尝试将其转换为整数
{//那是一个整数
最小值=值;最大值=值;//最小值和最大值
}
其他的
{//这不是一个范围,也不是一个整数!尖叫!
抛出新ArgumentException(输入+“不是有效输入!”);
}
}
其他的
{//这是一个范围
var parts=input.Split(新字符[]{separator},2);//在分隔符上拆分为2
if(int.TryParse(parts[0],out-int-part1)和&int.TryParse(parts[1],out-int-part2))//两个部分都是int?
{                        
Min=Math.Min(第1部分,第2部分);//Min是最小值,max是最大值。
Max=Math.Max(part1,part2);//计算min/Max比修复错误输入更容易。
}
否则{//它看起来像一个范围,但那些不是int!尖叫!
抛出新ArgumentException(输入+“不是有效输入!”);
}
}
}
公共int Min{get;set;}
公共int Max{get;set;}
//比较结合在一起。{1-1}<{1-2}<{1-6}<{2-2};
公共整数比较(范围对象)
{
var mincomparer=this.Min.CompareTo(obj.Min);
var maxcomparer=此.Max.CompareTo(obj.Max);
返回mincomparer==0?maxcomparer:mincomparer;
}
公共重写字符串ToString()
{
返回Min==Max?Min.ToString():Min+“-”+Max;
}
}
}

你试过了吗?或者?如果你有一个介于5之间的值,比如这里的“1”,“3-6”,“5”,“2”,“8-10”,“7”,“11”,“13-18”,“12”,我们不是来做你的工作的,那就是思考,尝试,再思考。但是,我们很乐意帮助您解决代码中的特定问题。提供您尝试过的内容以及您遇到的问题。如果您的输入不包含某个范围内的任何数字,您可以简单地提取每个范围的下限并将其用于排序。我建议使用和作为编写问题或解决问题的指南。我非常确信,对您想要的内容的清晰描述几乎是可编译的代码。