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

360影视 国产动漫 2025-04-10 08:41 2

摘要:数字字符串比较是一个高度请求的功能,用于按数值而非字典顺序比较字符串。例如,2小于10,因此“2”在按数值排序时应出现在“10”之前。同样,“2”和“02”在数值上是相等的。通过新的

数字字符串比较是一个高度请求的功能,用于按数值而非字典顺序比较字符串。例如,2小于10,因此“2”在按数值排序时应出现在“10”之前。同样,“2”和“02”在数值上是相等的。通过新的CompareOptions.NumericOrdering选项,现在可以进行这些类型的比较Sample

来看几个简单的使用示例吧:

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))
{

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

从输出结果可以看到,使用默认的排序会按照字母的顺序进行排列,而使用新的 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))
{

}

输出结果如下:

sample2再来比较两个字符串数字,022,这两个在数值上是等价的Console.WriteLine(numericStringComparer.Equals("02", "2"));

输出结果也为 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))
{

}
IP compare sampleReferences

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

相关推荐