在C# LINQ中如何按状态将ListRecords拆分为两个独立列表
如何用LINQ将ListRecords拆分为有效/无效两个列表?
原始数据
你的ListRecords列表数据如下:
InCorrectNumber CorrectNumber Status --------------------------------------- 10101010 7003594558 VALID 20202020 7003310682 VALID 2244448 2222222 INVALID 30303030 6130985705 VALID 3434448 1111111 INVALID 8273648 3333333 INVALID
问题分析
你现有代码的核心问题:
- 数据源错误:应该从原始的
ListRecords筛选,而非从目标列表(ValidList1/InValidValidList1,初始为空)查询 - 类型转换缺失:
Where返回的是IEnumerable<T>,需调用ToList()才能转为List<T> - 字符串常量未加引号:
VALID/INVALID是字符串的话,必须用双引号包裹 - 未按需投影字段:你需要的是不含
Status的结果,需通过Select提取目标字段
正确实现方案
假设你的accounts类定义
public class accounts { public string InCorrectNumber { get; set; } public string CorrectNumber { get; set; } public string Status { get; set; } }
方案1:两次遍历(简单直观,适合中小数据量)
代码可读性高,性能足够应对大多数场景:
// 生成有效列表,只保留需要的字段 var ValidList1 = ListRecords .Where(e => e.Status == "VALID") .Select(e => new { e.InCorrectNumber, e.CorrectNumber }) .ToList(); // 生成无效列表,同样投影目标字段 var InValidList1 = ListRecords .Where(e => e.Status == "INVALID") .Select(e => new { e.InCorrectNumber, e.CorrectNumber }) .ToList();
方案2:一次遍历(性能更优,适合大数据量)
仅遍历数据源一次,节省遍历开销:
// 按状态分组 var grouped = ListRecords.GroupBy(e => e.Status == "VALID"); // 从分组中提取有效/无效数据 var ValidList1 = grouped.First(g => g.Key) .Select(e => new { e.InCorrectNumber, e.CorrectNumber }) .ToList(); var InValidList1 = grouped.First(g => !g.Key) .Select(e => new { e.InCorrectNumber, e.CorrectNumber }) .ToList();
或者用foreach手动拆分(逻辑更直白):
var ValidList1 = new List<dynamic>(); var InValidList1 = new List<dynamic>(); foreach (var item in ListRecords) { var resultItem = new { item.InCorrectNumber, item.CorrectNumber }; if (item.Status == "VALID") { ValidList1.Add(resultItem); } else { InValidList1.Add(resultItem); } }
性能说明
- 两次遍历方案:代码简洁,中小数据量(万级以内)无性能问题,优先推荐
- 一次遍历方案:仅遍历一次数据源,十万级以上数据量能明显节省时间,适合性能敏感场景
内容的提问来源于stack exchange,提问作者user17824023
相关产品推荐
相关产品推荐

