You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:33:02