如何在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
相关产品推荐
相关产品推荐

