Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按前缀编号然后按字母顺序对字符串列表进行排序_C#_Sorting - Fatal编程技术网

C# 如何按前缀编号然后按字母顺序对字符串列表进行排序

C# 如何按前缀编号然后按字母顺序对字符串列表进行排序,c#,sorting,C#,Sorting,我的目标是将一个列表按杂乱无章的顺序排序为这样一个[“1”、“1a”、“2”、“2a”、“2b”、“a”、“b”] 我的代码有点长,所以我在这个链接中包含了它 我要做的是使用Regex.split(string,([0-9]+)”)[0]拆分字符串,然后根据通过int.TryParse的字符串,对列表进行数字或字母排序 正则表达式匹配字符串中包含的所有整数 在我应用正则表达式之前,它会排序。虽然它可以排序,但不能正确地排序 应用正则表达式时,会出现以下错误: ArgumentException:

我的目标是将一个
列表
按杂乱无章的顺序排序为这样一个
[“1”、“1a”、“2”、“2a”、“2b”、“a”、“b”]

我的代码有点长,所以我在这个链接中包含了它

我要做的是使用
Regex.split(string,([0-9]+)”)[0]
拆分字符串,然后根据通过
int.TryParse
的字符串,对列表进行数字或字母排序

正则表达式匹配字符串中包含的所有整数

在我应用正则表达式之前,它会排序。虽然它可以排序,但不能正确地排序

应用正则表达式时,会出现以下错误:

ArgumentException:无法排序,因为IComparer.Compare()方法返回不一致的结果。一个值与自身比较不相等,或者一个值与另一个值重复比较会产生不同的结果。IComparer:'System.Comparison'1[Ndot\u Partnering\u Tool.Data.Models.Project两个问题:

  • SplitRegex()在参数“a”上失败,因为它与regex不匹配(regex.Split返回一个元素的数组)。您可以使用以下代码:

    返回Regex.Split(x,“([0-9]+)”)”.ElementAtOrDefault(1)??string.Empty

  • 当x和y都不能转换为整数时,可以为x和y调用CompareString(),但x和y不是完整的字符串,它们只是数字部分(因为是空的)。您需要按原样传递列表项以比较并提取其中的数字:

     bool leftcanconvertflag = Int32.TryParse(SplitRegex(x), out leftconvertresult);
     bool rightcanconvertflag = Int32.TryParse(SplitRegex(y), out rightconvertresult);
     if (leftcanconvertflag && !rightcanconvertflag)
     {
         compareresult = -1;
     }
    
     if (!leftcanconvertflag && rightcanconvertflag)
     {
         compareresult = 1;
     }
    
     if (leftcanconvertflag && rightcanconvertflag)
     {
         compareresult = leftconvertresult.CompareTo(rightconvertresult);
     }
    
     if (!leftcanconvertflag && !rightcanconvertflag)
     {
         compareresult = CompareString(x, y);
     }
    
  • 并对列表进行如下排序:

    list.Sort(CompareContractNumbers);
    
    两个问题:

  • SplitRegex()在参数“a”上失败,因为它与regex不匹配(regex.Split返回一个元素的数组)。您可以使用以下代码:

    返回Regex.Split(x,“([0-9]+)”)”.ElementAtOrDefault(1)??string.Empty

  • 当x和y都不能转换为整数时,可以为x和y调用CompareString(),但x和y不是完整的字符串,它们只是数字部分(因为是空的)。您需要按原样传递列表项以比较并提取其中的数字:

     bool leftcanconvertflag = Int32.TryParse(SplitRegex(x), out leftconvertresult);
     bool rightcanconvertflag = Int32.TryParse(SplitRegex(y), out rightconvertresult);
     if (leftcanconvertflag && !rightcanconvertflag)
     {
         compareresult = -1;
     }
    
     if (!leftcanconvertflag && rightcanconvertflag)
     {
         compareresult = 1;
     }
    
     if (leftcanconvertflag && rightcanconvertflag)
     {
         compareresult = leftconvertresult.CompareTo(rightconvertresult);
     }
    
     if (!leftcanconvertflag && !rightcanconvertflag)
     {
         compareresult = CompareString(x, y);
     }
    
  • 并对列表进行如下排序:

    list.Sort(CompareContractNumbers);
    

    对于这个特殊的任务,OrderBy方法非常适合您。我将使用它而不是Regex。 OrderBy使用lambda表达式作为键进行排序。 由于此方法使用的字母表中,字母在数字之后,因此您实际上可以在默认情况下进行排序

    你可以做:

    List<string> List = new List<string>() {"a", "2b", "1a", "1", "2", "2a", "b", "1b" };
    List<string> OrderedList = List.OrderBy(x => x).ToList(); 
    
    List List=newlist(){“a”、“2b”、“1a”、“1”、“2”、“2a”、“b”、“1b”};
    List OrderedList=List.OrderBy(x=>x.ToList();
    
    OrderBy方法返回IEnumerable,因此必须将其转换回List

    输出:

    原始列表:a 2b 1a 1 2 a b 1b


    有序列表:1 1a 1b 2 2a 2b a b

    对于这个特定任务,OrderBy方法非常适合您。我将使用它而不是Regex。 OrderBy使用lambda表达式作为键进行排序。 由于此方法使用的字母表中,字母在数字之后,因此您实际上可以在默认情况下进行排序

    你可以做:

    List<string> List = new List<string>() {"a", "2b", "1a", "1", "2", "2a", "b", "1b" };
    List<string> OrderedList = List.OrderBy(x => x).ToList(); 
    
    List List=newlist(){“a”、“2b”、“1a”、“1”、“2”、“2a”、“b”、“1b”};
    List OrderedList=List.OrderBy(x=>x.ToList();
    
    OrderBy方法返回IEnumerable,因此必须将其转换回List

    输出:

    原始列表:a 2b 1a 1 2 a b 1b


    有序列表:1 1a 1b 2 2a 2b a b

    因此您必须将字符串拆分为(可选)数字部分和(可选)剩余部分。这可以通过正则表达式完成:

    var match = Regex.Match(item, @"(?<number>\d+)?(?<rest>.*)$");
    
    var match=Regex.match(项,@“(?\d+)(?*)$”;
    
    “number”部分匹配一个或多个数字,但是可选的(问号),“rest”部分匹配字符串的整个剩余部分

    通过Linq排序:

    var input = new List<string>{ "12a", "1", "1a", "2", "2a", "2b", "a", "b", "12a" };
    var sorted = input.OrderBy(item =>
    {
        var match = Regex.Match(item, @"(?<number>\d+)?(?<rest>.*)$");
        return Tuple.Create(match.Groups["number"].Success ? int.Parse(match.Groups["number"].Value) : -1, match.Groups["rest"].Value);
    }).ToList();
    
    var输入=新列表{“12a”、“1”、“1a”、“2”、“2a”、“2b”、“a”、“b”、“12a”};
    var sorted=input.OrderBy(项=>
    {
    var match=Regex.match(项,@“(?\d+)(?.*)$”;
    返回Tuple.Create(match.Groups[“number”].Success?int.Parse(match.Groups[“number”].Value):-1,match.Groups[“rest”].Value);
    }).ToList();
    
    (我故意决定将没有前导号的项目放在其他项目之前;这在问题中没有具体说明)


    输出:a、b、1、1a、2、2a、2b、12a

    因此您必须将字符串分为(可选)数字部分和(可选)剩余部分。这可以通过正则表达式完成:

    var match = Regex.Match(item, @"(?<number>\d+)?(?<rest>.*)$");
    
    var match=Regex.match(项,@“(?\d+)(?*)$”;
    
    “number”部分匹配一个或多个数字,但是可选的(问号),“rest”部分匹配字符串的整个剩余部分

    通过Linq排序:

    var input = new List<string>{ "12a", "1", "1a", "2", "2a", "2b", "a", "b", "12a" };
    var sorted = input.OrderBy(item =>
    {
        var match = Regex.Match(item, @"(?<number>\d+)?(?<rest>.*)$");
        return Tuple.Create(match.Groups["number"].Success ? int.Parse(match.Groups["number"].Value) : -1, match.Groups["rest"].Value);
    }).ToList();
    
    var输入=新列表{“12a”、“1”、“1a”、“2”、“2a”、“2b”、“a”、“b”、“12a”};
    var sorted=input.OrderBy(项=>
    {
    var match=Regex.match(项,@“(?\d+)(?.*)$”;
    返回Tuple.Create(match.Groups[“number”].Success?int.Parse(match.Groups[“number”].Value):-1,match.Groups[“rest”].Value);
    }).ToList();
    
    (我故意决定将没有前导号的项目放在其他项目之前;这在问题中没有具体说明)


    输出:a,b,1,1a,2,2a,2b,12a

    如果您想要的是:“[“1”,“1a”,“2”,“2a”,“2b”,“a”,“b”]”,那么您可以简单地对字符串进行排序,因为数字按排序顺序排在字母之前。列表是否也包括“12a”以及是否在“2a”之前或之后排序?@Klaus“12a”必须排在“2a”之后同样,如果它是2之后的12。可能,“100000z”必须在“9000z”之后。如果您想要的是:“[“1”、“1a”、“2”、“2a”、“2b”、“a”、“b”]”,那么您可以简单地对字符串进行排序,因为数字按排序顺序排在字母之前。列表是否也可以包括“12a”,它应该在“2a”之前或之后排序?@Klaus“12a”必须排在“2a”之后同样,好像它是2之后的12。可能,“100000z”必须在“9000z”之后。从技术上讲,这不会在2a之后排序12a,但它做得足够好。我认为我最初要求的是不可能的,因为它可能会对两个等效字符串进行不同的排序。另外,我只是喜欢OrderBy linq。从技术上讲