dotnet 10 基于数字的字符串比较

dotnet 10 基于数字的字符串比较dotnet 10 基于数字的字符串比较 Introdotnet 10 里支持了基于数字比较的字符串比较 NumericOrder 数字字符串比较是一个高度请求的功能 用于按数值而非字典顺序比较字符串 例如 2 小于 10 因此 2 在按数值

欢迎大家来到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
来进行排序比较,输出结果类似下面这样:

dotnet 10 基于数字的字符串比较

欢迎大家来到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);
}

输出结果如下:

dotnet 10 基于数字的字符串比较
sample2

再来比较两个字符串数字,022,这两个在数值上是等价的

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);
}
dotnet 10 基于数字的字符串比较
IP compare sample

References

  • 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

(0)
上一篇 17分钟前
下一篇 7分钟前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信