如何用LINQ高效拆分C#的Invoice列表为两个子列表?
看起来你可能表述里有点小矛盾哦——如果要从ListA里移除IsSelected为True的元素并存到ListB,那最终ListA应该剩下IsSelected为False的元素才对,但你后面说ListA留存True的元素。我先按**移除IsSelected=True的元素到ListB,ListA保留False**的常见需求来给方案,要是实际需求反过来,只需要调整条件就行~
高效一次遍历的拆分方案
如果不想改动原ListA,而是生成两个全新的列表,最推荐的是用ToLookup,只需要遍历一次原列表:
var invoiceLookup = ListA.ToLookup(inv => inv.IsSelected); var ListB = invoiceLookup[true].ToList(); // 被移除的IsSelected=True的元素 var updatedListA = invoiceLookup[false].ToList(); // 留存的元素
要是你偏好手动遍历(避免LINQ的小开销),也可以这么写:
var ListB = new List<Invoice>(); var updatedListA = new List<Invoice>(); foreach (var inv in ListA) { if (inv.IsSelected) ListB.Add(inv); else updatedListA.Add(inv); } // 要是需要替换原ListA的内容,就加下面两句 ListA.Clear(); ListA.AddRange(updatedListA);
修改原ListA的简洁写法
如果你确实需要直接修改原ListA(把IsSelected=True的元素移除),同时把这些元素存入ListB,用LINQ+List的RemoveAll很简洁:
var ListB = ListA.Where(inv => inv.IsSelected).ToList(); ListA.RemoveAll(inv => inv.IsSelected);
⚠️ 注意:这个写法会遍历原列表两次(一次Where,一次RemoveAll),如果你的ListA数据量很大,还是用上面一次遍历的方案更高效。
要是你需求真的反过来(ListA留True,ListB存False)
只需要把条件里的IsSelected取反就行:
// 修改原ListA的情况 var ListB = ListA.Where(inv => !inv.IsSelected).ToList(); ListA.RemoveAll(inv => !inv.IsSelected); // 生成新列表的情况 var invoiceLookup = ListA.ToLookup(inv => inv.IsSelected); var updatedListA = invoiceLookup[true].ToList(); var ListB = invoiceLookup[false].ToList();
内容的提问来源于stack exchange,提问作者Sayansen
相关产品推荐
相关产品推荐

