将字符串整数与C#中的范围进行比较的最有效方法



我有一个整数范围需要检查,但我用于比较的字段是一个字符串。

此字符串中可能包含非整数值。应跳过具有非整数值的字符串。

范围只是另外两个整数。

如果字符串列表中有一万个数字,我想知道最快的方法是什么。我考虑过简单的int.TryParse,然后在范围之间进行条件检查,,但我想知道是否有更快的方法

不寻求意见,渴望看到基准数据。

以下是数据和最小/最大范围的示例。

int min = 1000;
int max = 4999;
List<string> orderNumbers = new List<string>
{
"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;

注意:您可以很容易地使用.Select(x => x.Value),它必须创建相同的完全IL


如果你经常这样做,那么理想情况下你的列表不会是string类型。

或者只使用foreach环路

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

如果你考虑的是原始效率,而你的有效数字总是没有文化差异的数字,比如1000的分隔符等等。您可以从自己的TryParse方法和(可选(使用指针或Span<T>迭代字符中获得更好的性能

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

相关内容

  • 没有找到相关文章

最新更新