数字字符串比较是一个高度请求的功能,用于按数值而非字典顺序比较字符串。例如,2小于10,因此“2”在按数值排序时应出现在“10”之前。同样,“2”和“02”在数值上是相等的。通过新的CompareOptions.NumericOrdering选项,现在可以进行这些类型的比较Sample摘要:数字字符串比较是一个高度请求的功能,用于按数值而非字典顺序比较字符串。例如,2小于10,因此“2”在按数值排序时应出现在“10”之前。同样,“2”和“02”在数值上是相等的。通过新的
来看几个简单的使用示例吧:
varnumericStringComparer = StringComparer.Create(CultureInfo.InvariantCulture, CompareOptions.NumericOrdering);varlist = Enumerable.Range(15)
.Select(n => Random.Shared.Next(2* n,20).ToString)
.ToArray;
Console.WriteLine(string.Join(", ", list));
foreach(variteminlist.Order)
{
Console.WriteLine(item);
}
Console.WriteLine(nameof(numericStringComparer));
foreach(variteminlist.Order(numericStringComparer))
{
}
这个示例是随机生成了五个数字,然后通过来进行排序比较,输出结果类似下面这样:
从输出结果可以看到,使用默认的排序会按照字母的顺序进行排列,而使用新的 numeric comparer 之后就可以按照数字大小来排序
再来看一个例子,前面是纯数字,再来看一个混合的字符串
foreach(varosinnew { "Windows 8", "Windows 10", "Windows 11" }.Order){
Console.WriteLine(os);
}
Console.WriteLine;
foreach(varosinnew { "Windows 8", "Windows 10", "Windows 11" }.Order(numericStringComparer))
{
}
输出结果如下:
输出结果也为 True
类似地我们也可以指定 HashSet 的 comparer,下面的示例输出结果也为 True
varset=newHashSetstring>(numericStringComparer) { "007" };Console.WriteLine(set.Contains("7"));
// Output: True
还有一个有时候会用的场景就是 IP 的排序,之前可能会按.split 再按数字进行排序,现在可以尝试使用新的基于数字的比较器来比较了varIP1 = "127.0.0.1";
varip2 = "172.16.124.123";
varip3 = "172.16.23.25";
foreach(varipinnew{ ip1, ip2, ip3 }.Order)
{
Console.WriteLine(ip);
}
Console.WriteLine;
foreach(varipinnew{ ip1, ip2, ip3 }.Order(numericStringComparer))
{
}
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
来源:opendotnet