万普插件库

jQuery插件大全与特效教程

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

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);
}

这个示例是随机生成了五个数字,然后通过
CompareOptions.NumericOrdering
来进行排序比较,输出结果类似下面这样:

sample1

从输出结果可以看到,使用默认的排序会按照字母的顺序进行排列,而使用新的 numeric comparer 之后就可以按照数字大小来排序

再来看一个例子,前面是纯数字,再来看一个混合的字符串

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

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

Console.WriteLine(numericStringComparer.Equals("02", "2"));

输出结果也为 True

类似地我们也可以指定 HashSet 的 comparer,下面的示例输出结果也为 True

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 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/109861
  • https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/libraries?WT.mc_id=DT-MVP-5004222#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-5004222#system-globalization-compareoptions-numericordering
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言