如何使用LINQ提取Double值并合并为数组?
用LINQ实现字符串数值提取的思路与代码
当然可以用LINQ实现这个逻辑,核心思路是用LINQ的链式调用替代嵌套循环,同时保留原有的筛选和转换逻辑:
- 扁平化分割结果:先用
Split(';')把原字符串拆分成一级子串,再通过SelectMany将每个一级子串按:拆分后的二级子串合并成一个扁平集合,替代原有的两层foreach循环。 - 筛选有效元素:用
Where方法过滤掉空/空白字符串,以及以#开头的子串,对应原代码中的if判断条件。 - 类型转换与收集:用
Select将筛选后的字符串转换为double类型,最后用ToList()收集成列表(或者直接用于输出)。
对应LINQ实现代码
string r = "#1:234.1;#2:2344.2:#3:38.0"; List<double> v = r.Split(';') .SelectMany(x => x.Split(':')) .Where(y => !string.IsNullOrWhiteSpace(y) && !y.StartsWith("#")) .Select(double.Parse) .ToList(); Console.WriteLine(string.Join("\n", v));
更安全的版本(处理转换失败的情况)
如果原字符串可能存在无法转换为double的无效内容,可以用double.TryParse避免抛出异常:
string r = "#1:234.1;#2:2344.2:#3:38.0;#4:abc"; List<double> v = new List<double>(); r.Split(';') .SelectMany(x => x.Split(':')) .Where(y => !string.IsNullOrWhiteSpace(y) && !y.StartsWith("#")) .ToList() .ForEach(y => { if (double.TryParse(y, out double num)) v.Add(num); }); Console.WriteLine(string.Join("\n", v));
内容的提问来源于stack exchange,提问作者Adison
相关产品推荐
相关产品推荐

