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两个问题:
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);
两个问题:
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。从技术上讲