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_Compare_Hyphen_String Comparison - Fatal编程技术网

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 at
int.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 at
int.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拆分字符串