C# 将字符串整数与C中的范围进行比较的最有效方法#
我需要检查一个整数范围,但用于比较的字段是字符串 此字符串中可能包含非整数值。应跳过具有非整数值的字符串 范围仅为另外两个整数 我想知道最快的方法是什么,如果字符串列表中有一万个数字。我只考虑了int.TryParse,然后在范围之间进行条件检查,但我想知道是否有更快的方法 不寻求意见,渴望看到基准数据 下面是数据和范围min/max的示例C# 将字符串整数与C中的范围进行比较的最有效方法#,c#,performance,integer,string-comparison,C#,Performance,Integer,String Comparison,我需要检查一个整数范围,但用于比较的字段是字符串 此字符串中可能包含非整数值。应跳过具有非整数值的字符串 范围仅为另外两个整数 我想知道最快的方法是什么,如果字符串列表中有一万个数字。我只考虑了int.TryParse,然后在范围之间进行条件检查,但我想知道是否有更快的方法 不寻求意见,渴望看到基准数据 下面是数据和范围min/max的示例 int最小值=1000; int max=4999; List ordernumber=新列表 { "4021", "*1002", "5000", "45
int最小值=1000;
int max=4999;
List ordernumber=新列表
{
"4021",
"*1002",
"5000",
"4500"
};
TryParse
会很好用
var results = orderNumbers
.Select(x => int.TryParse(x, out var i) ? i : (int?) null)
.Where(x => x >= min && x <= max)
.Cast<int>() // resolve the nullable;
如果您感到无聊,请创建自己的迭代器扩展方法 如果你看原始效率,你的有效数字总是没有文化差异的数字,比如1000的分隔符等等。您可以通过自己的
TryParse
方法和(可选)使用指针或Span
[MethodImpl(MethodImplOptions.AggressiveInline)]
公共静态不安全bool MyTryParse(字符串源、int-min、int-max、out-int-value)
{
数值=0;
已修复(char*p=源)
{
for(var i=0;i='0'和&p[i]=最小值和值
var results = new List<int>(orderNumbers.Count);
foreach (var item in orderNumbers)
if (int.TryParse(item, out var value) && value >= min && value <= max)
results.Add(value);
public IEnumerable<int> GetRange(this IEnumerable<string> source, int min, int max)
{
foreach (var item in source)
if (int.TryParse(item, out var value) && value >= min && value <= max)
yield return value;
}
var results = orderNumbers.GetRange(min,max);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe bool MyTryParse(string source, int min, int max, out int value)
{
value = 0;
fixed (char* p = source)
{
for (var i = 0; i < source.Length; i++)
if (p[i] >= '0' && p[i] <= '9')
value = value * 10 + p[i] - '0';
else
return false;
}
return value >= min && value <= max;
}