欢迎大家来到IT世界,在知识的湖畔探索吧!
dotnet 10 基于数字的字符串比较
Intro
dotnet 10 里支持了基于数字比较的字符串比较 NumericOrdering
数字字符串比较是一个高度请求的功能,用于按数值而非字典顺序比较字符串。例如,2小于10,因此“2”在按数值排序时应出现在“10”之前。同样,“2”和“02”在数值上是相等的。通过新的 选项,现在可以进行这些类型的比较
CompareOptions.NumericOrdering
Sample
来看几个简单的使用示例吧:
var numericStringComparer = StringComparer.Create(CultureInfo.InvariantCulture, CompareOptions.NumericOrdering);
var list = Enumerable.Range(1, 5)
.Select(n => Random.Shared.Next(2 * n, 20).ToString())
.ToArray();
Console.WriteLine(string.Join(", ", list));
foreach (var item in list.Order())
{
Console.WriteLine(item);
}
Console.WriteLine(nameof(numericStringComparer));
foreach (var item in list.Order(numericStringComparer))
{
Console.WriteLine(item);
}
欢迎大家来到IT世界,在知识的湖畔探索吧!
这个示例是随机生成了五个数字,然后通过 来进行排序比较,输出结果类似下面这样:
CompareOptions.NumericOrdering

欢迎大家来到IT世界,在知识的湖畔探索吧!
sample1从输出结果可以看到,使用默认的排序会按照字母的顺序进行排列,而使用新的 numeric comparer 之后就可以按照数字大小来排序
再来看一个例子,前面是纯数字,再来看一个混合的字符串
欢迎大家来到IT世界,在知识的湖畔探索吧!foreach (var os in new[] { "Windows 8", "Windows 10", "Windows 11" }.Order())
{
Console.WriteLine(os);
}
Console.WriteLine();
foreach (var os in new[] { "Windows 8", "Windows 10", "Windows 11" }.Order(numericStringComparer))
{
Console.WriteLine(os);
}
输出结果如下:

sample2再来比较两个字符串数字,02 和 2,这两个在数值上是等价的
Console.WriteLine(numericStringComparer.Equals("02", "2"));
输出结果也为 True
类似地我们也可以指定 HashSet 的 comparer,下面的示例输出结果也为 True
欢迎大家来到IT世界,在知识的湖畔探索吧!var set = new HashSet<string>(numericStringComparer) { "007" };
Console.WriteLine(set.Contains("7"));
// Output: True
还有一个有时候会用的场景就是 IP 的排序,之前可能会按 . split 再按数字进行排序,现在可以尝试使用新的基于数字的比较器来比较了
var ip1 = "127.0.0.1";
var ip2 = "172.16.124.123";
var ip3 = "172.16.23.25";
foreach (var ip in new[]{ ip1, ip2, ip3 }.Order())
{
Console.WriteLine(ip);
}
Console.WriteLine();
foreach (var ip in new[]{ ip1, ip2, ip3 }.Order(numericStringComparer))
{
Console.WriteLine(ip);
}

IP compare sampleReferences
-
https://github.com/WeihanLi/SamplesInPractice/blob/main/net10sample/Net10Samples/StringComparerSample.cs
-
https://github.com/dotnet/runtime/issues/13979
-
https://github.com/dotnet/runtime/pull/
-
https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/libraries?WT.mc_id=DT-MVP-#numeric-ordering-for-string-comparison
-
https://learn.microsoft.com/en-us/dotnet/api/system.globalization.compareoptions?view=net-10.0&WT.mc_id=DT-MVP-#system-globalization-compareoptions-numericordering
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/123546.html