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

如何在C# LINQ中对HoldItems列表分组并拼接ItemName字符串?

实现按分类分组并拼接商品名称的LINQ方案

嘿,我来帮你搞定这个分组拼接的需求~先梳理下你的目标:基于现有的selectedItemList(List<DomainEntities.HoldItems>),先过滤出ItemType == 5且BelongItemIndex等于指定对象C在列表中索引的项,再按BelongCategoryName分组,最后把每个组内的ItemName用逗号分隔拼接起来。

优化后的LINQ实现

首先要提个小细节:List.IndexOf(C)是遍历列表的操作,如果直接写在LINQ的过滤条件里,每一条数据都会触发一次遍历,会浪费性能。所以我们先提前计算好这个索引值,再进行后续操作。

查询语法风格

如果你习惯LINQ的查询式写法:

// 提前获取C在列表中的索引,避免重复计算
var targetIndex = selectedItemList.IndexOf(C);

var groupedResult = from item in selectedItemList
                    where item.ItemType == 5 && item.BelongItemIndex == targetIndex
                    group item by item.BelongCategoryName into categoryGroup
                    select new 
                    {
                        // 分组对应的分类名称
                        CategoryName = categoryGroup.Key,
                        // 拼接该分类下的所有ItemName,用逗号加空格分隔
                        CombinedItemNames = string.Join(", ", categoryGroup.Select(i => i.ItemName))
                    };

方法语法风格

要是你更偏爱链式调用的写法:

var targetIndex = selectedItemList.IndexOf(C);

var groupedResult = selectedItemList
    .Where(item => item.ItemType == 5 && item.BelongItemIndex == targetIndex)
    .GroupBy(item => item.BelongCategoryName)
    .Select(group => new 
    {
        CategoryName = group.Key,
        CombinedItemNames = string.Join(", ", group.Select(i => i.ItemName))
    });

额外扩展

如果你需要同时保留每个分组下的原始HoldItems对象,而不仅仅是拼接后的名称,可以在匿名类里再加一个属性:

.Select(group => new 
{
    CategoryName = group.Key,
    CombinedItemNames = string.Join(", ", group.Select(i => i.ItemName)),
    // 保留该分类下的所有原始对象
    CategoryItems = group.ToList()
});

另外,如果你的项目基于.NET Framework 4.0及以下版本,string.Join不支持直接传入IEnumerable<string>,可以把group.Select(i => i.ItemName)转成数组:string.Join(", ", group.Select(i => i.ItemName).ToArray())

内容的提问来源于stack exchange,提问作者Sithija Sahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:33:39