在C#开发中,数值解析是一个看似简单却暗藏性能陷阱的操作。当我们处理大量CSV文件、日志解析或数据导入时,Double.Parse() 和 float.Parse() 往往成为性能瓶颈。你是否遇到过这样的场景:
今天,我将为你揭秘一个能让C#数值解析性能提升3-9倍的神器——csFastFloat,让你的程序真正"快如闪电"!
在深入解决方案之前,让我们先看看csFastFloat到底有多快:
Markdown测试环境:.NET 9.0,Intel Xeon Gold 6338 CPU 测试数据:150,000个随机浮点数 | 方法 | 处理时间 | 性能提升 | 处理速度(MB/s) | |------------------------|------------|----------|----------------| | Double.Parse() | 14,575 μs | 基准 | 194.07 | | FastFloat.TryParse() | 3,141 μs | 4.6倍 | 899.86 |
结果惊人:在处理大量数值数据时,csFastFloat的性能提升高达4.6倍!
NuGet包安装
BashInstall-Package csFastFloat

应用场景:财务数据、用户行为分析、IoT传感器数据导入
C#using System.Text;
using csFastFloat;
namespace AppcsFastFloat
{
public class FastCsvParser
{
public List<SalesRecord> ParseSalesData(string csvContent)
{
var records = new List<SalesRecord>();
var lines = csvContent.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
// 跳过表头,从第二行开始解析
for (int i = 1; i < lines.Length; i++)
{
var line = lines[i].Trim();
if (string.IsNullOrEmpty(line)) continue;
var fields = line.Split(',');
// 确保字段数量足够
if (fields.Length < 6) continue;
try
{
var record = new SalesRecord
{
Id = int.Parse(fields[0].Trim()),
ProductName = fields[1].Trim().Trim('"'), // 处理可能的引号
// 🚀 性能提升点:使用FastFloat替代标准解析器
Amount = FastDoubleParser.ParseDouble(fields[2].Trim()),
Discount = FastFloatParser.ParseFloat(fields[3].Trim()),
TaxRate = FastDoubleParser.ParseDouble(fields[4].Trim()),
SaleDate = DateTime.Parse(fields[5].Trim())
};
// 计算净金额和税额
record.NetAmount = record.Amount * (1 - record.Discount);
record.TaxAmount = record.NetAmount * record.TaxRate;
record.TotalAmount = record.NetAmount + record.TaxAmount;
records.Add(record);
}
catch (Exception ex)
{
// 记录解析错误但继续处理其他行
Console.WriteLine($"解析第 {i + 1} 行时出错: {ex.Message}");
}
}
return records;
}
// 从文件读取并解析
public List<SalesRecord> ParseSalesDataFromFile(string filePath)
{
var csvContent = File.ReadAllText(filePath, Encoding.UTF8);
return ParseSalesData(csvContent);
}
// 异步版本
public async Task<List<SalesRecord>> ParseSalesDataFromFileAsync(string filePath)
{
var csvContent = await File.ReadAllTextAsync(filePath, Encoding.UTF8);
return ParseSalesData(csvContent);
}
// 流式处理大文件版本
public IEnumerable<SalesRecord> ParseSalesDataStream(string filePath)
{
using var reader = new StreamReader(filePath, Encoding.UTF8);
// 跳过表头
reader.ReadLine();
string line;
int lineNumber = 1;
while ((line = reader.ReadLine()) != null)
{
lineNumber++;
line = line.Trim();
if (string.IsNullOrEmpty(line)) continue;
var fields = line.Split(',');
if (fields.Length < 6) continue;
SalesRecord record = null;
try
{
record = new SalesRecord
{
Id = int.Parse(fields[0].Trim()),
ProductName = fields[1].Trim().Trim('"'),
Amount = FastDoubleParser.ParseDouble(fields[2].Trim()),
Discount = FastFloatParser.ParseFloat(fields[3].Trim()),
TaxRate = FastDoubleParser.ParseDouble(fields[4].Trim()),
SaleDate = DateTime.Parse(fields[5].Trim())
};
record.NetAmount = record.Amount * (1 - record.Discount);
record.TaxAmount = record.NetAmount * record.TaxRate;
record.TotalAmount = record.NetAmount + record.TaxAmount;
}
catch (Exception ex)
{
Console.WriteLine($"解析第 {lineNumber} 行时出错: {ex.Message}");
continue;
}
if (record != null)
yield return record;
}
}
}
public class SalesRecord
{
public int Id { get; set; }
public string ProductName { get; set; } = string.Empty;
public double Amount { get; set; }
public float Discount { get; set; }
public double TaxRate { get; set; }
public DateTime SaleDate { get; set; }
// 计算字段
public double NetAmount { get; set; }
public double TaxAmount { get; set; }
public double TotalAmount { get; set; }
public override string ToString()
{
return $"Id: {Id}, Product: {ProductName}, Amount: {Amount:C2}, " +
$"Discount: {Discount:P2}, Tax: {TaxRate:P2}, Total: {TotalAmount:C2}";
}
}
// 示例使用和性能测试
class Program
{
static async Task Main(string[] args)
{
var parser = new FastCsvParser();
// 创建示例CSV数据
var sampleCsv = CreateSampleCsvData();
// 性能测试
await PerformanceTest(parser, sampleCsv);
// 基本使用示例
await BasicUsageExample(parser);
}
static string CreateSampleCsvData()
{
var csv = new StringBuilder();
csv.AppendLine("Id,ProductName,Amount,Discount,TaxRate,SaleDate");
var random = new Random();
for (int i = 1; i <= 10000; i++)
{
csv.AppendLine($"{i},\"Product {i}\",{random.Next(100, 10000)}.{random.Next(10, 99)}," +
$"{random.NextDouble() * 0.3:F3},{random.NextDouble() * 0.15 + 0.05:F4}," +
$"{DateTime.Now.AddDays(-random.Next(365)):yyyy-MM-dd}");
}
return csv.ToString();
}
static async Task PerformanceTest(FastCsvParser parser, string csvData)
{
Console.WriteLine("=== 性能测试 ===");
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
var records = parser.ParseSalesData(csvData);
stopwatch.Stop();
Console.WriteLine($"解析 {records.Count} 条记录");
Console.WriteLine($"耗时: {stopwatch.ElapsedMilliseconds} ms");
Console.WriteLine($"平均每条记录: {(double)stopwatch.ElapsedMilliseconds / records.Count:F4} ms");
Console.WriteLine();
}
static async Task BasicUsageExample(FastCsvParser parser)
{
Console.WriteLine("=== 基本使用示例 ===");
var simpleCsv = @"Id,ProductName,Amount,Discount,TaxRate,SaleDate
1,""笔记本电脑"",8999.99,0.15,0.13,2024-01-15
2,""无线鼠标"",299.50,0.10,0.13,2024-01-16
3,""机械键盘"",899.00,0.05,0.13,2024-01-17";
var records = parser.ParseSalesData(simpleCsv);
Console.WriteLine("解析结果:");
foreach (var record in records)
{
Console.WriteLine(record);
}
Console.WriteLine();
Console.WriteLine("统计信息:");
Console.WriteLine($"总记录数: {records.Count}");
Console.WriteLine($"总销售额: {records.Sum(r => r.Amount):C2}");
Console.WriteLine($"平均折扣: {records.Average(r => r.Discount):P2}");
Console.WriteLine($"总净收入: {records.Sum(r => r.NetAmount):C2}");
Console.WriteLine($"总税额: {records.Sum(r => r.TaxAmount):C2}");
}
}
}

性能提升关键:在处理包含10万行销售数据的CSV时,解析时间从原来的快!
应用场景:用户输入验证、API参数解析、配置文件读取
C#using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using csFastFloat;
namespace AppcsFastFloat
{
public class SafeNumberParser
{
private readonly double _minValue;
private readonly double _maxValue;
public SafeNumberParser(double minValue = 0, double maxValue = 1000000)
{
_minValue = minValue;
_maxValue = maxValue;
}
// ✨ TryParse模式 - 基础版本
public bool TryParseUserInput(string userInput, out double result)
{
if (FastDoubleParser.TryParseDouble(userInput, out result))
{
return IsValidRange(result);
}
result = 0;
return false;
}
// 🚀 增强版本 - 支持多种格式和文化信息
public bool TryParseAdvanced(string userInput, out double result, CultureInfo culture = null)
{
result = 0;
if (string.IsNullOrWhiteSpace(userInput))
return false;
// 清理输入(移除多余空格、货币符号等)
var cleanInput = CleanInput(userInput);
// 使用指定文化或当前文化
culture ??= CultureInfo.CurrentCulture;
if (FastDoubleParser.TryParseDouble(cleanInput, out result))
{
return IsValidRange(result) && !double.IsNaN(result) && !double.IsInfinity(result);
}
return false;
}
// 🔥 批量验证配置文件
public ValidationResult ValidateConfigValues(Dictionary<string, string> config)
{
var result = new ValidationResult();
foreach (var kvp in config)
{
if (TryParseAdvanced(kvp.Value, out double value))
{
result.ValidValues[kvp.Key] = value;
result.SuccessCount++;
}
else
{
result.InvalidValues[kvp.Key] = kvp.Value;
result.ErrorMessages.Add($"⚠️ 配置项 '{kvp.Key}' 值无效: '{kvp.Value}'");
}
}
return result;
}
// 📊 批量解析数值数组
public ParseArrayResult ParseNumberArray(string[] inputs)
{
var result = new ParseArrayResult();
for (int i = 0; i < inputs.Length; i++)
{
if (TryParseAdvanced(inputs[i], out double value))
{
result.Values.Add(value);
result.Indices.Add(i);
}
else
{
result.FailedIndices.Add(i);
result.FailedValues.Add(inputs[i]);
}
}
return result;
}
// 🎯 解析带单位的数值(如:100kg, 50.5m, 25%)
public bool TryParseWithUnit(string input, out double value, out string unit)
{
value = 0;
unit = string.Empty;
if (string.IsNullOrWhiteSpace(input))
return false;
// 分离数字和单位
var numberPart = new StringBuilder();
var unitPart = new StringBuilder();
bool foundNumber = false;
foreach (char c in input.Trim())
{
if (char.IsDigit(c) || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E')
{
if (!foundNumber && unitPart.Length > 0)
break; // 如果已经开始收集单位,就不能再有数字
numberPart.Append(c);
foundNumber = true;
}
else if (foundNumber)
{
unitPart.Append(c);
}
}
unit = unitPart.ToString().Trim();
return TryParseAdvanced(numberPart.ToString(), out value);
}
// 🔧 CSV行解析
public CsvRowResult ParseCsvRow(string csvRow, char separator = ',')
{
var result = new CsvRowResult();
var fields = csvRow.Split(separator);
for (int i = 0; i < fields.Length; i++)
{
var field = fields[i].Trim().Trim('"'); // 移除引号
if (TryParseAdvanced(field, out double value))
{
result.NumericValues[i] = value;
}
else if (!string.IsNullOrEmpty(field))
{
result.TextValues[i] = field;
}
}
return result;
}
// 🛡️ 安全范围检查
private bool IsValidRange(double value) =>
value >= _minValue &&
value <= _maxValue &&
!double.IsNaN(value) &&
!double.IsInfinity(value);
// 🧹 输入清理
private string CleanInput(string input)
{
if (string.IsNullOrEmpty(input))
return input;
return input
.Replace("$", "") // 移除货币符号
.Replace("€", "")
.Replace("¥", "")
.Replace(",", "") // 移除千位分隔符(在某些文化中)
.Replace(" ", "") // 移除空格
.Trim();
}
// 📈 统计信息
public ParsingStats GetStats()
{
return new ParsingStats
{
MinAllowedValue = _minValue,
MaxAllowedValue = _maxValue,
ParserInfo = "csFastFloat Library"
};
}
}
// 📋 结果类定义
public class ValidationResult
{
public Dictionary<string, double> ValidValues { get; } = new();
public Dictionary<string, string> InvalidValues { get; } = new();
public List<string> ErrorMessages { get; } = new();
public int SuccessCount { get; set; }
public int FailureCount => InvalidValues.Count;
public double SuccessRate => SuccessCount + FailureCount == 0 ? 0 : (double)SuccessCount / (SuccessCount + FailureCount) * 100;
}
public class ParseArrayResult
{
public List<double> Values { get; } = new();
public List<int> Indices { get; } = new();
public List<int> FailedIndices { get; } = new();
public List<string> FailedValues { get; } = new();
public int SuccessCount => Values.Count;
public int FailureCount => FailedIndices.Count;
}
public class CsvRowResult
{
public Dictionary<int, double> NumericValues { get; } = new();
public Dictionary<int, string> TextValues { get; } = new();
public int TotalFields => NumericValues.Count + TextValues.Count;
public int NumericFieldCount => NumericValues.Count;
}
public class ParsingStats
{
public double MinAllowedValue { get; set; }
public double MaxAllowedValue { get; set; }
public string ParserInfo { get; set; }
}
// 🚀 使用示例
public class Program
{
public static void Main()
{
Console.OutputEncoding= Encoding.UTF8;
var parser = new SafeNumberParser(0, 1000000);
// 示例1:基础解析
Console.WriteLine("=== 基础解析测试 ===");
TestBasicParsing(parser);
// 示例2:配置文件验证
Console.WriteLine("\n=== 配置文件验证 ===");
TestConfigValidation(parser);
// 示例3:数组解析
Console.WriteLine("\n=== 数组解析测试 ===");
TestArrayParsing(parser);
// 示例4:带单位解析
Console.WriteLine("\n=== 带单位解析测试 ===");
TestUnitParsing(parser);
// 示例5:CSV解析
Console.WriteLine("\n=== CSV解析测试 ===");
TestCsvParsing(parser);
}
private static void TestBasicParsing(SafeNumberParser parser)
{
string[] testInputs = { "123.45", "invalid", "999999", "1000001", "-50" };
foreach (var input in testInputs)
{
if (parser.TryParseUserInput(input, out double result))
{
Console.WriteLine($"✅ '{input}' -> {result}");
}
else
{
Console.WriteLine($"❌ '{input}' -> 解析失败");
}
}
}
private static void TestConfigValidation(SafeNumberParser parser)
{
var config = new Dictionary<string, string>
{
{"timeout", "30.5"},
{"maxConnections", "100"},
{"invalidSetting", "not_a_number"},
{"percentage", "85.7"}
};
var result = parser.ValidateConfigValues(config);
Console.WriteLine($"成功解析: {result.SuccessCount}");
Console.WriteLine($"解析失败: {result.FailureCount}");
Console.WriteLine($"成功率: {result.SuccessRate:F1}%");
foreach (var error in result.ErrorMessages)
{
Console.WriteLine(error);
}
}
private static void TestArrayParsing(SafeNumberParser parser)
{
string[] numbers = { "1.1", "2.2", "invalid", "4.4", "5.5" };
var result = parser.ParseNumberArray(numbers);
Console.WriteLine($"解析成功: {result.SuccessCount}/{numbers.Length}");
Console.WriteLine($"有效值: [{string.Join(", ", result.Values)}]");
}
private static void TestUnitParsing(SafeNumberParser parser)
{
string[] inputs = { "100kg", "25.5%", "50m", "invalid", "75.2cm" };
foreach (var input in inputs)
{
if (parser.TryParseWithUnit(input, out double value, out string unit))
{
Console.WriteLine($"✅ '{input}' -> 数值: {value}, 单位: '{unit}'");
}
else
{
Console.WriteLine($"❌ '{input}' -> 解析失败");
}
}
}
private static void TestCsvParsing(SafeNumberParser parser)
{
string csvRow = "张三,25,175.5,\"软件工程师\",85000.50";
var result = parser.ParseCsvRow(csvRow);
Console.WriteLine($"总字段数: {result.TotalFields}");
Console.WriteLine($"数值字段: {result.NumericFieldCount}");
Console.WriteLine("数值字段:");
foreach (var kvp in result.NumericValues)
{
Console.WriteLine($" 位置 {kvp.Key}: {kvp.Value}");
}
Console.WriteLine("文本字段:");
foreach (var kvp in result.TextValues)
{
Console.WriteLine($" 位置 {kvp.Key}: {kvp.Value}");
}
}
}
}

最佳实践提醒:
应用场景:服务器日志分析、性能监控、业务指标统计
C#using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using csFastFloat;
namespace AppcsFastFloat
{
public class LogAnalyzer
{
public class LogMetrics
{
public double ResponseTime { get; set; }
public float CpuUsage { get; set; }
public double MemoryUsage { get; set; }
public DateTime Timestamp { get; set; }
public override string ToString()
{
return $"时间: {Timestamp:yyyy-MM-dd HH:mm:ss}, " +
$"响应时间: {ResponseTime:F2}ms, " +
$"CPU: {CpuUsage:F1}%, " +
$"内存: {MemoryUsage:F2}MB";
}
}
public List<LogMetrics> ParseLogFile(string filePath)
{
var metrics = new List<LogMetrics>();
if (!File.Exists(filePath))
{
Console.WriteLine($"文件不存在: {filePath}");
return metrics;
}
foreach (var line in File.ReadLines(filePath))
{
var span = line.AsSpan();
var metric = ParseLogLine(span);
if (metric != null)
metrics.Add(metric);
}
return metrics;
}
private LogMetrics ParseLogLine(ReadOnlySpan<char> logLine)
{
// 日志格式: 2024-01-15 10:30:45.123 ResponseTime:125.45ms CPU:23.5% Memory:456.78MB
var parts = logLine.ToString().Split(' ', StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 6) return null;
var metric = new LogMetrics();
// 解析时间戳
if (DateTime.TryParse($"{parts[0]} {parts[1]}", out var timestamp))
metric.Timestamp = timestamp;
// 解析响应时间 (ResponseTime:125.45ms)
if (TryExtractNumber(parts[2], out var responseTime))
metric.ResponseTime = responseTime;
// 解析CPU使用率 (CPU:23.5%)
if (TryExtractNumber(parts[3], out var cpuUsage))
metric.CpuUsage = (float)cpuUsage;
// 解析内存使用 (Memory:456.78MB)
if (TryExtractNumber(parts[4], out var memoryUsage))
metric.MemoryUsage = memoryUsage;
return metric;
}
private bool TryExtractNumber(string text, out double number)
{
number = 0;
// 查找冒号后的数字部分
var colonIndex = text.IndexOf(':');
if (colonIndex == -1) return false;
var valueText = text.Substring(colonIndex + 1);
// 提取数字部分,忽略单位后缀 (ms, %, MB等)
var numericPart = new string(valueText.TakeWhile(c => char.IsDigit(c) || c == '.' || c == '-').ToArray());
return FastDoubleParser.TryParseDouble(numericPart, out number);
}
// 添加一些分析方法
public void PrintStatistics(List<LogMetrics> metrics)
{
if (!metrics.Any())
{
Console.WriteLine("没有可分析的数据");
return;
}
var avgResponseTime = metrics.Average(m => m.ResponseTime);
var maxResponseTime = metrics.Max(m => m.ResponseTime);
var avgCpuUsage = metrics.Average(m => m.CpuUsage);
var avgMemoryUsage = metrics.Average(m => m.MemoryUsage);
Console.WriteLine("\n=== 性能统计 ===");
Console.WriteLine($"总记录数: {metrics.Count}");
Console.WriteLine($"平均响应时间: {avgResponseTime:F2} ms");
Console.WriteLine($"最大响应时间: {maxResponseTime:F2} ms");
Console.WriteLine($"平均CPU使用率: {avgCpuUsage:F1}%");
Console.WriteLine($"平均内存使用: {avgMemoryUsage:F2} MB");
}
}
// 主程序调用示例
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
// 创建测试日志文件
CreateSampleLogFile();
var analyzer = new LogAnalyzer();
Console.WriteLine("🚀 开始解析日志文件...\n");
// 解析日志文件
var metrics = analyzer.ParseLogFile("sample.log");
// 显示解析结果
Console.WriteLine("=== 日志解析结果 ===");
foreach (var metric in metrics.Take(5)) // 只显示前5条
{
Console.WriteLine(metric);
}
if (metrics.Count > 5)
{
Console.WriteLine($"... 还有 {metrics.Count - 5} 条记录");
}
// 显示统计信息
analyzer.PrintStatistics(metrics);
// 性能测试
PerformanceTest(analyzer);
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
// 创建示例日志文件
static void CreateSampleLogFile()
{
var sampleData = new[]
{
"2024-01-15 10:30:45.123 ResponseTime:125.45ms CPU:23.5% Memory:456.78MB",
"2024-01-15 10:30:46.234 ResponseTime:89.23ms CPU:19.2% Memory:445.12MB",
"2024-01-15 10:30:47.345 ResponseTime:156.78ms CPU:31.8% Memory:478.90MB",
"2024-01-15 10:30:48.456 ResponseTime:203.45ms CPU:42.1% Memory:512.34MB",
"2024-01-15 10:30:49.567 ResponseTime:98.67ms CPU:25.3% Memory:467.89MB",
"2024-01-15 10:30:50.678 ResponseTime:134.12ms CPU:28.9% Memory:489.45MB",
"2024-01-15 10:30:51.789 ResponseTime:167.89ms CPU:35.7% Memory:503.67MB",
"2024-01-15 10:30:52.890 ResponseTime:87.45ms CPU:18.4% Memory:434.23MB",
"2024-01-15 10:30:53.901 ResponseTime:245.67ms CPU:48.9% Memory:545.78MB",
"2024-01-15 10:30:54.012 ResponseTime:123.34ms CPU:26.7% Memory:471.56MB"
};
File.WriteAllLines("sample.log", sampleData);
Console.WriteLine("✅ 示例日志文件已创建: sample.log\n");
}
// 简单的性能测试
static void PerformanceTest(LogAnalyzer analyzer)
{
Console.WriteLine("\n=== 性能测试 ===");
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// 解析1000次来测试性能
for (int i = 0; i < 1000; i++)
{
analyzer.ParseLogFile("sample.log");
}
stopwatch.Stop();
Console.WriteLine($"解析1000次耗时: {stopwatch.ElapsedMilliseconds} ms");
Console.WriteLine($"平均每次耗时: {stopwatch.ElapsedMilliseconds / 1000.0:F3} ms");
}
}
}

应用场景:内存敏感应用、高频调用场景、嵌入式系统
C#using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using csFastFloat;
namespace AppcsFastFloat
{
public class SpanOptimizedParser
{
// 🎯 零分配解析:适用于高频调用场景
public double ParseFromSpan(ReadOnlySpan<char> numberSpan)
{
// 直接从Span解析,避免字符串分配
return FastDoubleParser.ParseDouble(numberSpan);
}
// 🚀 批量处理优化
public void ProcessNumberArray(ReadOnlySpan<char> data, List<double> results)
{
int start = 0;
for (int i = 0; i < data.Length; i++)
{
if (data[i] == ',' || i == data.Length - 1)
{
var numberSpan = data.Slice(start, i - start);
if (FastDoubleParser.TryParseDouble(numberSpan, out double value))
{
results.Add(value);
}
start = i + 1;
}
}
}
// 📊 便捷方法:直接返回数组
public double[] ParseNumbers(string csvNumbers)
{
var results = new List<double>();
ProcessNumberArray(csvNumbers.AsSpan(), results);
return results.ToArray();
}
}
// 💡 简单使用示例
class Program
{
static void Main(string[] args)
{
var parser = new SpanOptimizedParser();
// 单个数字解析
var number = parser.ParseFromSpan("123.456".AsSpan());
Console.WriteLine($"解析结果: {number}");
// 批量解析CSV格式数字
string csvData = "1.23,4.56,7.89,10.11";
var numbers = parser.ParseNumbers(csvData);
Console.WriteLine("批量解析结果:");
foreach (var num in numbers)
{
Console.WriteLine($" {num}");
}
// 高性能批量处理
var results = new List<double>();
parser.ProcessNumberArray(csvData.AsSpan(), results);
Console.WriteLine($"共解析 {results.Count} 个数字");
}
}
}

应用场景:网络数据流处理、二进制文件解析、跨平台数据交换
C#using System;
using System.Collections.Generic;
using System.Text;
using csFastFloat;
public class Utf8ByteParser
{
public List<double> ParseFromUtf8Bytes(ReadOnlySpan<byte> utf8Data)
{
var numbers = new List<double>();
int start = 0;
for (int i = 0; i <= utf8Data.Length; i++)
{
// 寻找分隔符或到达末尾
if (i == utf8Data.Length || utf8Data[i] == (byte)' ' || utf8Data[i] == (byte)',')
{
if (i > start) // 确保有内容要解析
{
var numberBytes = utf8Data.Slice(start, i - start);
// 将字节转换为字符串,然后使用 csFastFloat 解析
var numberString = Encoding.UTF8.GetString(numberBytes);
if (FastDoubleParser.TryParseDouble(numberString, out double value))
{
numbers.Add(value);
}
}
start = i + 1;
}
}
return numbers;
}
}
// 使用示例
class Program
{
static void Main()
{
var parser = new Utf8ByteParser();
// 测试数据:包含空格和逗号分隔的数字
string testData = "1.23 4.56,7.89 10.11,12.34";
byte[] utf8Bytes = Encoding.UTF8.GetBytes(testData);
// 解析数字
var results = parser.ParseFromUtf8Bytes(utf8Bytes);
// 输出结果
Console.WriteLine("解析结果:");
foreach (var number in results)
{
Console.WriteLine(number);
}
Console.WriteLine($"共解析了 {results.Count} 个数字");
}
}

通过本文的深入探讨,我们掌握了csFastFloat的三个核心要点:
想要让你的C#程序性能飞跃提升吗?
🔥 立即行动:在下一个涉及大量数值解析的项目中尝试csFastFloat!
💬 互动话题:
觉得这篇文章对你有帮助?请转发给更多需要性能优化的.NET开发同行! 让我们一起让C#程序跑得更快! 🚀
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!