我正在寻找一种最简单的方法来排序由数字和文本组成的数组,以及这些数组的组合.
例如
'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'
Run Code Online (Sandbox Code Playgroud)
变成
'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'
Run Code Online (Sandbox Code Playgroud)
这将与我在这里提出的另一个问题的解决方案结合使用.
排序函数本身就可以工作,我需要的是一个可以说'19asd'小于'123asd'的函数.
我是用JavaScript编写的.
编辑:正如adormitu指出的那样,我正在寻找的是一种自然分类的功能
我有一个string[],其中每个元素都以一些数字值结尾.
string[] partNumbers = new string[]
{
"ABC10", "ABC1","ABC2", "ABC11","ABC10", "AB1", "AB2", "Ab11"
};
Run Code Online (Sandbox Code Playgroud)
我试图按如下方式对上面的数组进行排序,LINQ但我没有得到预期的结果.
var result = partNumbers.OrderBy(x => x);
Run Code Online (Sandbox Code Playgroud)
实际结果:
AB1
Ab11
AB2
ABC1
ABC10
ABC10
ABC11
ABC2
预期结果
AB1
AB2
AB11
..
我正在寻找一种算法来排序字符串,类似于在Windows资源管理器中排序文件(和文件夹)的方式.似乎在排序时会考虑字符串中的数值,这会产生类似的结果
name 1, name 2, name 10
Run Code Online (Sandbox Code Playgroud)
代替
name 1, name 10, name 2
Run Code Online (Sandbox Code Playgroud)
通过常规字符串比较得到的.
我本人即将开始写这篇文章,但是想要检查一下是否有人这样做过,并愿意分享一些代码或见解.我接近这个的方法是在比较之前将前导零添加到名称中的数值.这会产生类似的结果
name 00001, name 00010, name 00002
Run Code Online (Sandbox Code Playgroud)
当使用常规字符串排序进行排序时,会给出正确的结果.
有任何想法吗?
习惯于对字符串进行排序的标准方法,当我注意到Windows以某种高级方式按名称对文件进行排序时,我感到很惊讶.让我给你举个例子:
Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3
我认为这些名称是根据字母和数字分别比较(在排序期间).
另一方面,以下是以标准方式排序的相同列表:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3
我想在Delphi中创建一个比较算法,让我以相同的方式对字符串进行排序.起初我认为比较两个字符串的连续字符就足够了.当在两个字符串的某个位置找到一个数字时,我会读取它们后面的所有数字以形成一个数字,然后比较这些数字.
举个例子,我将用这种方式比较"Track10"和"Track2"字符串:
1)读取字符时它们是相等的,而它们是字母:"Track","Track"
2)如果找到一个数字,读取以下所有数字:"10","2"
2a)如果它们相等,则转到1或者完成
Ten大于2,因此"Track10"大于"Track2"
似乎一切都会好的,直到我在测试期间发现Windows认为"Track010"低于"Track10",而我认为第一个更长,因为它更长(没有提到根据我的算法字符串将是相等的,这是错误的).
你能否告诉我Windows如何按名称对文件进行排序,或者你有一个我可以使用的即用型算法(使用任何编程语言)?
非常感谢!
马里乌什
我有一个像这样的列表:
var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"};
Run Code Online (Sandbox Code Playgroud)
如果我调用l.Sort(),列表将以1,10,2,3的顺序排序,这从纯字符串的角度来看是有意义的,但是从用户角度来看很糟糕.
因为我不想/不能强迫我的用户将它们命名为01,02,03,...我想知道是否有内置方法或简单算法来正确检测和排序数字,以便我有1,2,3,10?由于数字只有1或2个字符长(即不超过99),我可以做一个正则表达式,暂时为所有1位数字加前缀0和排序,但在重新发明轮子之前,我想知道是否已存在某些内容?
.net 3.5SP1如果重要,不是4.0
获取LINQ查询(从SQL数据库 - 这有关系吗?)的最简单方法是自然地对字符串进行排序?
例如,我目前正在获得这些结果:
我想要看的是:
我正在使用的查询是这样的:
return from p in dataContext.Projects
orderby p.Name
select p;
Run Code Online (Sandbox Code Playgroud) 如果你有像这样的字符串:
"file_0"
"file_1"
"file_2"
"file_3"
"file_4"
"file_5"
"file_6"
"file_11"
Run Code Online (Sandbox Code Playgroud)
如何对它们进行排序,使"file_11"不会出现在"file_1"之后,而是出现在"file_6"之后,因为11> 6.
我是否必须解析字符串并将其转换为数字?
Win7中的Windows资源管理器按我想要的方式对文件进行排序.
我有一个字符串,其中包含以句点分隔的数字.当我排序时它看起来像这样,因为它是一个字符串:(ascii char order)
3.9.5.2.1.1
3.9.5.2.1.10
3.9.5.2.1.11
3.9.5.2.1.12
3.9.5.2.1.2
3.9.5.2.1.3
3.9.5.2.1.4
Run Code Online (Sandbox Code Playgroud)
等等
我希望它像这样排序:(按数字顺序)
3.9.5.2.1.1
3.9.5.2.1.2
3.9.5.2.1.3
...
3.9.5.2.1.9
3.9.5.2.1.10
3.9.5.2.1.11
3.9.5.2.1.12
Run Code Online (Sandbox Code Playgroud)
我知道我可以:
如果重复现有功能,我宁愿避免所有这些工作..net框架中的方法是否已经执行此操作?
可能重复:
C#中的自然排序顺序
我有一个包含大量数字的列表.但是由于一些额外的字母,它们被保存为字符串.
我的列表看起来像这样:
1
10
11
11a
11b
12
2
20
21a
21c
A1
A2
...
Run Code Online (Sandbox Code Playgroud)
但它应该是这样的
1
2
10
11a
11b
...
A1
A2
...
Run Code Online (Sandbox Code Playgroud)
如何对列表进行排序以获得此结果?
我一直在寻找解决方案一段时间了.
当我使用字符串排序对下面排序时,我有一个列表:
10
10b
1111
1164
1174
23
23A
23B
23D
23E
Run Code Online (Sandbox Code Playgroud)
我真的希望列表是:
10
10b
23
23A
23B
23D
23E
1111
1164
1174
Run Code Online (Sandbox Code Playgroud)
数字排序也不能完成这项工作.
sorting ×8
c# ×7
.net ×3
natural-sort ×3
numbers ×3
string ×3
algorithm ×2
linq ×2
list ×2
comparison ×1
javascript ×1
text ×1