如果我们排序,这两个名字的正确排列是什么
What is the right arrangement of these two names if we sort it
我有两个文件夹,名称分别为 CLP2_v6
和 CLP_DE0_v7
。当我尝试使用 Icomparer 对其进行排序时,结果是:
使用 StrCmpLogicalW(Windows):
CLP_DE0_v7
CLP2_v6
我现在很困惑,因为当我尝试使用这个 Text Line Sorter 对单词进行排序时,我得到了不同的答案:
使用 TextLineSorter:
CLP2_v6
CLP_DE0_v7
我想在我的程序上显示的是这样的:
首选:
CLP2_v6
CLP_DE0_v7
这里 VB.net 是我的代码:
Public Class StringCompare
Implements IComparer(Of String)
Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" _
(ByVal s1 As String, ByVal s2 As String) As Int32
Public Function Compare(x As String, y As String) As Integer Implements _
System.Collections.Generic.IComparer(Of String).Compare
Return StrCmpLogicalW(x, y)
End Function
End Class
Sub Main()
Dim UsortedArray() As String = {
"CLP_DE0_v7",
"CLP2_v6"
}
Dim rc As New StringCompare()
Console.WriteLine(vbLf & "Windows Sorting:")
Array.Sort(UsortedArray, rc)
Console.WriteLine()
For Each dinosaur As String In UsortedArray
Console.WriteLine(dinosaur)
Next
End Sub
如果我们尝试对这两个词进行排序,正确的排列方式是什么?排序有很多规则可循吗?或者排序有很多标准?
根据所需的结果、上下文或可用的工具,有许多不同的排序方法。由于您拥有 .NET,您不再受限于技术,而是您自己的要求。
考虑这些情况:
特定文化
'Array sorted by English culture
{"aa", "bb", "cc", "ch", "dd", "ee", "ff", "gg", "hh", "ii"}
'Same array sorted by Czech culture
{"aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ch", "ii"}
你听说过 ě, ê, è, é 吗? :)
你把它们放在哪里? "e"之前,"e"之后,"z"之后?这取决于您的文化和需求。
技术特定
假设您有字节数组中的 ANSI 字符串。按字节值排序 returns 不同于按字符在字母表中的位置排序。
用户特定需求
"a"比"A"多吗?一般是什么?您的具体需求是什么?
名为“9”的目录是否多于名为“10”的目录?将它排序为字符串,你会得到 {"10", "9"},在 windows 资源管理器中打开它,你会看到 {"9", "10}。在 Total Commander 中打开它,你将为同一目录再次获取 {"10", "9"}。
结论
您应该根据具体情况定义您真正需要的内容。并找到正确或简单的方法来做到这一点。在 .NET 中,您的结果将取决于 Threading.Thread.CurrentThread.CultureInfo
或您自己的 IComparer,您可以将其提供给 IList.Sort 方法或 SortedList/SortedSet 构造函数。
风险
您应该注意不同文化信息下的不同排序。例如,在 "hu-HU" 文化下创建和填充 SortedList(Of String, Object) 在某些情况下会在读取 "cs-CZ" 文化下的项目后导致奇怪的异常,因为项目不会按预期排序并且二叉搜索树会糊涂了。
我有两个文件夹,名称分别为 CLP2_v6
和 CLP_DE0_v7
。当我尝试使用 Icomparer 对其进行排序时,结果是:
使用 StrCmpLogicalW(Windows):
CLP_DE0_v7
CLP2_v6
我现在很困惑,因为当我尝试使用这个 Text Line Sorter 对单词进行排序时,我得到了不同的答案:
使用 TextLineSorter:
CLP2_v6
CLP_DE0_v7
我想在我的程序上显示的是这样的:
首选:
CLP2_v6
CLP_DE0_v7
这里 VB.net 是我的代码:
Public Class StringCompare
Implements IComparer(Of String)
Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" _
(ByVal s1 As String, ByVal s2 As String) As Int32
Public Function Compare(x As String, y As String) As Integer Implements _
System.Collections.Generic.IComparer(Of String).Compare
Return StrCmpLogicalW(x, y)
End Function
End Class
Sub Main()
Dim UsortedArray() As String = {
"CLP_DE0_v7",
"CLP2_v6"
}
Dim rc As New StringCompare()
Console.WriteLine(vbLf & "Windows Sorting:")
Array.Sort(UsortedArray, rc)
Console.WriteLine()
For Each dinosaur As String In UsortedArray
Console.WriteLine(dinosaur)
Next
End Sub
如果我们尝试对这两个词进行排序,正确的排列方式是什么?排序有很多规则可循吗?或者排序有很多标准?
根据所需的结果、上下文或可用的工具,有许多不同的排序方法。由于您拥有 .NET,您不再受限于技术,而是您自己的要求。
考虑这些情况:
特定文化
'Array sorted by English culture
{"aa", "bb", "cc", "ch", "dd", "ee", "ff", "gg", "hh", "ii"}
'Same array sorted by Czech culture
{"aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ch", "ii"}
你听说过 ě, ê, è, é 吗? :)
你把它们放在哪里? "e"之前,"e"之后,"z"之后?这取决于您的文化和需求。
技术特定
假设您有字节数组中的 ANSI 字符串。按字节值排序 returns 不同于按字符在字母表中的位置排序。
用户特定需求
"a"比"A"多吗?一般是什么?您的具体需求是什么? 名为“9”的目录是否多于名为“10”的目录?将它排序为字符串,你会得到 {"10", "9"},在 windows 资源管理器中打开它,你会看到 {"9", "10}。在 Total Commander 中打开它,你将为同一目录再次获取 {"10", "9"}。
结论
您应该根据具体情况定义您真正需要的内容。并找到正确或简单的方法来做到这一点。在 .NET 中,您的结果将取决于 Threading.Thread.CurrentThread.CultureInfo
或您自己的 IComparer,您可以将其提供给 IList.Sort 方法或 SortedList/SortedSet 构造函数。
风险
您应该注意不同文化信息下的不同排序。例如,在 "hu-HU" 文化下创建和填充 SortedList(Of String, Object) 在某些情况下会在读取 "cs-CZ" 文化下的项目后导致奇怪的异常,因为项目不会按预期排序并且二叉搜索树会糊涂了。