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