将字符串整数与 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


如果您经常这样做,那么理想情况下您的列表不会是 type 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);

如果你觉得无聊,创建你自己的Iterator 扩展方法

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中从字符串中删除标点符号的最有效方法

在C中实现可变字符串的最有效方法是什么?

如何将整数与 C 中字符串中的字符进行比较?

C#中解析大型Xml字符串的最有效方法(扩展DTD引用,添加新行等)

计算字符串C ++中每个字母的频率最有效的方法是什么?

以最有效的形式将32位值存储为C字符串

使用 C# 4.8:从字符串数组或字符串列表中删除匹配字符串模式的项目的最有效方法

有什么适当的方法如何将整数放入字符串中?[C]

将int作为字符串存储在c中的有效方法

将整数添加为字符以在 C 中创建字符串

加整数与 C 中的字符串

将字符串与Enums比较的最有效方法是什么?

在C中减去无符号字符数组的最有效方法

如何以优雅有效的方式将无符号/有符号整数/长整数转换为 C 字符串?

将字符串另存为结构体中的整数。C

如何仅将整数从文件读取到也包含字符串的c ++程序中?

将字符串时间戳HH:MM:SS转换为C中的整数

是否可以将字符串转换为 C 中的整数/长表示形式?

字符串类中的指针与整数之间的比较-C ++

将所有STDIN都“吸收”到字符串中的最有效方法

将 2D numpy 数组中的每个元素与其 8 个邻居进行比较的最有效方法

将短字符串转换为32位整数的最有效方法是什么?

将字符串与C比较

在C#中无法将字符串识别为有效的日期时间

将字符串解析为整数并将它们存储在 C 中的数组(范围值)中

将日期时间与 varchar 进行比较的最有效方法

通过子字符串和索引对C#中的集合进行有效排序

C:将字符串与“%.c”进行比较?

C ++将字符串,整数,浮点数从文本文件中读取到数组/字符串中