从字符串列表中排除值为0的元素及foreach代码异常解决
问题:筛选排除值为0的字符串元素
需求
原始字符串列表:
A:2 B:2 C:0 D:0
需要排除值为0的元素,预期输出:
A:2 B:2
错误代码及异常
尝试的代码:
foreach (var item in charCnt.OrderBy(q => q).ToList().RemoveAll(p => p.Contains("0"))) { concat += item + ", "; //Concatenate items from the list }
抛出异常:
foreach statement cannot operate on variables of type 'int' because 'int' does not contain a public instance or extension definition for 'GetEnumerator'
更新信息
- 更新1:实际使用的列表
List charCnt = new List { "A:1", "C:-1", "C:1", "B:1", "B:1", "D:-2", "A:1", "D:2" };
- 更新2:曾尝试编写相关示例代码
解决方案
错误原因
List.RemoveAll()方法的返回值是被移除元素的数量(int类型),不是筛选后的集合,所以foreach无法遍历int类型的变量。
正确写法
方法1:用Linq筛选后处理(推荐,不修改原列表)
通过Where筛选掉值为0的元素,再排序,最后拼接结果:
// 筛选并排序 var filteredItems = charCnt.OrderBy(item => item) .Where(item => { // 拆分字符串并尝试转换为数值 if (int.TryParse(item.Split(':')[1], out int value)) { return value != 0; } return false; // 格式错误的项直接排除,可根据需求调整 }); // 直接用string.Join拼接,比foreach手动拼接更高效 string concat = string.Join(", ", filteredItems);
如果坚持要用foreach手动拼接:
string concat = ""; foreach (var item in filteredItems) { concat += item + ", "; } // 移除末尾多余的", " if (!string.IsNullOrEmpty(concat)) { concat = concat.TrimEnd(',', ' '); }
方法2:修改原列表后处理
如果需要直接修改原列表,可以先移除符合条件的元素,再排序遍历:
// 移除所有值为0的元素 charCnt.RemoveAll(item => { if (int.TryParse(item.Split(':')[1], out int value)) { return value == 0; } return true; // 格式错误的项也移除,可根据需求调整 }); // 排序后拼接 var sortedItems = charCnt.OrderBy(item => item); string concat = string.Join(", ", sortedItems);
注意点
- 不要用
Contains("0")判断值是否为0,会误判类似"A:10"、"C:-0"这类值不为0但字符串包含0的情况,必须解析为数值后判断。
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

