使用LINQ简化两个列表:保留索引并移除空值配对
使用LINQ处理关联支付列表的两种方案
针对动态生成的支付类别与金额列表,以下是两种满足需求的LINQ实现方式:
方案一:过滤后保留两个关联列表
通过索引遍历筛选出对应位置均非空的项,生成新的列表:
var originalCategories = new List<string> { "1", "2", "4", "5", "6" }; var originalAmounts = new List<object> { "20.20", "", "", 50.0, "" }; // 筛选有效索引:类别非空、金额非空/非空字符串 var validIndexes = Enumerable.Range(0, Math.Min(originalCategories.Count, originalAmounts.Count)) .Where(i => !string.IsNullOrWhiteSpace(originalCategories[i]) && !string.IsNullOrWhiteSpace(originalAmounts[i]?.ToString())); // 生成过滤后的列表 var filteredCategories = validIndexes.Select(i => originalCategories[i]).ToList(); var filteredAmounts = validIndexes.Select(i => originalAmounts[i].ToString()).ToList();
执行后得到的结果与期望一致:
filteredCategories= ["1","5"]filteredAmounts= ["20.20","50.0"]
方案二:合并为<int, decimal>类型字典
直接将有效项转换为键值对字典,同时完成类型转换:
var paymentDictionary = Enumerable.Range(0, Math.Min(originalCategories.Count, originalAmounts.Count)) .Where(i => int.TryParse(originalCategories[i], out _) && decimal.TryParse(originalAmounts[i]?.ToString(), out decimal amount) && !string.IsNullOrWhiteSpace(originalCategories[i])) .ToDictionary( i => int.Parse(originalCategories[i]), i => decimal.Parse(originalAmounts[i].ToString()) );
生成的字典结构为:{1:20.20, 5:50.0}
注意事项
- 若原始金额列表已经是字符串类型,可去掉
.ToString()调用简化代码 - 使用
Math.Min避免因两个列表长度不一致导致的索引越界问题 - 额外添加
int.TryParse和decimal.TryParse确保类型转换安全,避免运行时异常
内容的提问来源于stack exchange,提问作者Diin
相关产品推荐
相关产品推荐

