如何将字符串数组列表转字符串列表并优化C#标签统计排序Linq代码?
如何用LINQ简化标签提取与排序的代码?
我需要将字符串数组列表转换为字符串列表,同时面临以下场景:我有一个产品列表,每个产品包含一个以“#”拼接标签的字符串字段(示例:Tag1#Tag2#Tag3),需提取所有标签并按重复次数降序排序。我当前的实现代码如下:
List<string> t = new List<string>(); var tags = (from p in db.Products where p.Active select p.Tags ).ToList(); foreach (var item in tags) { if (item == null) continue; var d = item.Split('#'); foreach (var item2 in d) { t.Add(item2); } } var ans = t.GroupBy(p => new { id = p }).Select(g => new { id = g.Key.id, total = g.Count() }).OrderByDescending(g => g.total).ToList();
但我认为这段代码不够简洁(或许也不够优化),能否有人帮我用Linq语句将其简化优化?
当然可以!我们可以利用LINQ的链式调用和SelectMany方法,把整个流程简化成一段更紧凑、可读性更强的代码,同时还能减少不必要的临时变量和循环:
简化后的核心代码
var ans = db.Products // 先过滤掉无效数据:仅保留激活且标签字段不为空的产品 .Where(p => p.Active && p.Tags != null) // 分割每个产品的标签,并将所有标签扁平化为一个连续序列 .SelectMany(p => p.Tags.Split('#')) // 按标签内容分组 .GroupBy(tag => tag) // 生成包含标签和重复次数的匿名对象 .Select(group => new { Tag = group.Key, Count = group.Count() }) // 按重复次数降序排序 .OrderByDescending(result => result.Count) .ToList();
优化点说明
- 提前过滤无效数据:把
p.Tags != null放到Where条件里,避免后续对null值的判断和处理,减少不必要的计算 - 用
SelectMany替代嵌套循环:直接将每个产品分割后的标签数组扁平化为单个标签序列,不需要手动创建临时列表t来存储所有标签 - 简化分组逻辑:直接按标签本身分组,不需要额外创建
new { id = p }这样的匿名类,代码更简洁 - 链式调用提升可读性:整个逻辑从数据筛选到最终排序一气呵成,代码流程清晰明了
额外优化:处理空白标签
如果你的标签字段可能存在空字符串(比如Tag1##Tag3这种情况),可以在SelectMany之后添加一个过滤条件,剔除空白标签:
var ans = db.Products .Where(p => p.Active && !string.IsNullOrWhiteSpace(p.Tags)) .SelectMany(p => p.Tags.Split('#')) // 过滤掉空字符串和纯空白的标签 .Where(tag => !string.IsNullOrWhiteSpace(tag)) .GroupBy(tag => tag) .Select(group => new { Tag = group.Key, Count = group.Count() }) .OrderByDescending(result => result.Count) .ToList();
内容的提问来源于stack exchange,提问作者A.F.N
相关产品推荐
相关产品推荐

