如何在C# Linq中处理空字符串引发的System.FormatException异常
处理Linq中空字符串场景的解析异常问题
这个问题的核心原因很明确:当result是空字符串时,Split(',')方法并不会返回空数组,而是会生成一个包含单个空字符串的数组。这时候long.Parse("")自然会抛出System.FormatException,因为空字符串无法被解析为长整型。
下面给你几个不同场景下的解决方案,按需选择:
方案1:健壮处理所有无效输入(推荐)
如果不仅要处理空字符串,还要兼容其他可能的无效格式(比如非数字字符串、带空格的字符串),可以结合long.TryParse和Linq的筛选逻辑,只保留能成功解析的数值:
string result = ""; long[] ItemsToSkip = result.Split(',') // 先过滤掉空/空白字符串,减少无效解析尝试 .Where(x => !string.IsNullOrWhiteSpace(x)) // 尝试解析每个元素,只保留成功的结果 .Select(x => (IsValid: long.TryParse(x.Trim(), out long num), Value: num)) .Where(x => x.IsValid) .Select(x => x.Value) .ToArray();
这种方式的优势是容错性极强,不管是result为空、还是包含"1,,3"、" 5 , abc "这类混合内容,都能正确提取出有效的长整型数值,最终数组里只会有合法数据。
方案2:仅处理result为空的情况
如果你的场景中result要么是空字符串,要么是完全合法的逗号分隔数字(不会出现中间空元素或无效格式),可以直接先判断result状态:
string result = ""; long[] ItemsToSkip = string.IsNullOrWhiteSpace(result) ? Array.Empty<long>() : result.Split(',') .Select(x => long.Parse(x)) .ToArray();
这个方案代码更简洁,但只覆盖了result为空的边界场景,对其他无效输入依然会抛出异常。
方案3:自定义解析逻辑(灵活控制无效值)
如果你需要对无效值(比如空字符串、无法解析的内容)设置默认值,而不是直接过滤,可以这样写:
string result = ""; long[] ItemsToSkip = result.Split(',') .Select(x => { // 尝试解析,失败则返回默认值(比如0,根据你的业务需求调整) return long.TryParse(x.Trim(), out long num) ? num : 0; }) .ToArray();
这种方式会保留所有拆分后的元素数量,无效元素会被替换为你指定的默认值。
内容的提问来源于stack exchange,提问作者OneoFtheBest
相关产品推荐
相关产品推荐

