C# 使用连字符比较字符串
我找到了很多关于这个的帖子,但是没有把它们和我的案例匹配起来 我在列表中有一些字符串C# 使用连字符比较字符串,c#,sorting,compare,hyphen,string-comparison,C#,Sorting,Compare,Hyphen,String Comparison,我找到了很多关于这个的帖子,但是没有把它们和我的案例匹配起来 我在列表中有一些字符串 List List=新列表{“100-1”、“100-11”、“100-3”、“100-20”} 我使用下面的代码对从中选择的内容进行排序 void Main() { 字符串[]事物=新字符串[]{“100-1”、“100-11”、“100-3”、“100-20”}; foreach(things.OrderBy中的var thing(x=>x,new SemiNumericComparer()) {
List List=新列表{“100-1”、“100-11”、“100-3”、“100-20”}
我使用下面的代码对从中选择的内容进行排序
void Main()
{
字符串[]事物=新字符串[]{“100-1”、“100-11”、“100-3”、“100-20”};
foreach(things.OrderBy中的var thing(x=>x,new SemiNumericComparer())
{
控制台。写线(东西);
}
}
公共类半数字比较器:IComparer
{
公共整数比较(字符串s1、字符串s2)
{
if(IsNumeric(s1)和&IsNumeric(s2))
{
if(Convert.ToInt32(s1)>Convert.ToInt32(s2))返回1;
if(Convert.ToInt32(s1)
我的输出是100-1100-11100-20100-3
我认为它是将-
作为十进制
并比较值。事实上,我希望结果是
100-1100-31000-11100-20
。
我只是想知道它是在什么基础上进行排序的。感谢您的帮助。甚至我也希望它能以不同的方式对待100-2
和100-20
就在飞行中,我在基础设施控制网格中看到,在其中进行排序会产生与我在这里期望的相同的结果
编辑
列表中还有许多其他字符串值,有些是整数、双精度等。连字符只是这里提到的一个例子。如果要按第二个数字(在连字符之后)对项目进行排序,需要将字符串解析为一个数字,然后使用它进行排序。您可以尝试:
string[] things = new string[] { "100-1", "100-11", "100-3", "100-20" };
var test = things.OrderBy(r => int.Parse(r.Split('-')[1])).ToArray();
当前代码无法工作的原因可能是它无法将字符串
100-
解析为整数值,并且函数IsNumeric
返回false 如果要按第二个数字(连字符后)对项目进行排序,则需要将字符串解析为一个数字,然后使用它进行排序。您可以尝试:
string[] things = new string[] { "100-1", "100-11", "100-3", "100-20" };
var test = things.OrderBy(r => int.Parse(r.Split('-')[1])).ToArray();
var sorted = things.Select(s => s.Split('-'))
.OrderBy(x => double.Parse(x[0]))
.ThenBy(x => double.Parse(x[1]))
.Select(x=>String.Join("-",x))
.ToList();
当前代码无法工作的原因可能是它无法将字符串
100-
解析为整数值,并且函数IsNumeric
返回false 这应该如预期的那样起作用:
var sorted = things.Select(s => s.Split('-'))
.OrderBy(x => double.Parse(x[0]))
.ThenBy(x => double.Parse(x[1]))
.Select(x=>String.Join("-",x))
.ToList();
string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
IEnumerable<string> ordered = things
.Select(s => new
{
str = s,
firstPart = s.Split('-').ElementAtOrDefault(0),
secondPart = s.Split('-').ElementAtOrDefault(1)
})
.OrderBy(x => int.Parse(x.firstPart))
.ThenBy(x => int.Parse(x.firstPart))
.Select(x => x.str);
foreach (string s in ordered)
Console.WriteLine(s);
string[]things=新字符串[]{“100-1”、“100-11”、“100-3”、“100-20”};
IEnumerable=有序事物
。选择(s=>new
{
str=s,
第一部分=s.Split('-')。ElementAtOrderFault(0),
secondPart=s.Split('-').ElementAtOrDefault(1)
})
.OrderBy(x=>int.Parse(x.firstPart))
.ThenBy(x=>int.Parse(x.firstPart))
.选择(x=>x.str);
foreach(按顺序排列的字符串s)
控制台。写入线(s);
尽管它假定您的数据是严格的,否则您将面临异常,f.e atint.Parse(x.firstPart)
演示:这应该可以正常工作:
string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
IEnumerable<string> ordered = things
.Select(s => new
{
str = s,
firstPart = s.Split('-').ElementAtOrDefault(0),
secondPart = s.Split('-').ElementAtOrDefault(1)
})
.OrderBy(x => int.Parse(x.firstPart))
.ThenBy(x => int.Parse(x.firstPart))
.Select(x => x.str);
foreach (string s in ordered)
Console.WriteLine(s);
string[]things=新字符串[]{“100-1”、“100-11”、“100-3”、“100-20”};
IEnumerable=有序事物
。选择(s=>new
{
str=s,
第一部分=s.Split('-')。ElementAtOrderFault(0),
secondPart=s.Split('-').ElementAtOrDefault(1)
})
.OrderBy(x=>int.Parse(x.firstPart))
.ThenBy(x=>int.Parse(x.firstPart))
.选择(x=>x.str);
foreach(按顺序排列的字符串s)
控制台。写入线(s);
尽管它假定您的数据是严格的,否则您将面临异常,f.e atint.Parse(x.firstPart)
演示:+1…是的…IsNumeric返回false。但是,即使它将值作为字符串,那么它在什么基础上给我这个输出??另请参阅编辑后的文章,其中我提到,我还有许多其他类型的字符串(int,double as string)以及这种字符串。这样做是否可行?bcoz用户也可以输入除连字符之外的特殊字符???@rapsaland您的代码总是在
字符串中出现。比较(s1,s2,true)代码>因为123-45
不是一个数字。您得到的是一个正常的字符串排序。+1…是的…IsNumeric返回false。但是,即使它将值作为字符串,那么它在什么基础上给我这个输出??另请参阅编辑后的文章,其中我提到,我还有许多其他类型的字符串(int,double as string)以及这种字符串。这样做是否可行?bcoz用户也可以输入除连字符之外的特殊字符???@rapsaland您的代码总是在字符串中出现。比较(s1,s2,true)代码>因为123-45
不是一个数字。您将获得一个正常的字符串排序。如果用户可以使用不同的特殊字符而不是-
,那么这样做是否可行??这只是一个疑问:)@rapsalands:您可以使用多个分隔符。但如果您的输入是任意的,则不能使用拆分。但是有些地方出了问题。用户可以使用不同的特殊字符,而不是-
,这样做可行吗??这只是一个疑问:)@rapsalands:您可以使用多个分隔符。但如果您的输入是任意的,则不能使用拆分。但是有些地方出了问题。用户可以使用不同的特殊字符,而不是-
,这样做可行吗??这只是一个疑问:)@rapsalands您可以使用任何字符s拆分字符串