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

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.TryParse,然后在范围之间进行条件检查,但我想知道是否有更快的方法

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

下面是数据和范围min/max的示例

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