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

如何将字符串数组列表转字符串列表并优化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();

优化点说明

  1. 提前过滤无效数据:把p.Tags != null放到Where条件里,避免后续对null值的判断和处理,减少不必要的计算
  2. 用SelectMany替代嵌套循环:直接将每个产品分割后的标签数组扁平化为单个标签序列,不需要手动创建临时列表t来存储所有标签
  3. 简化分组逻辑:直接按标签本身分组,不需要额外创建new { id = p }这样的匿名类,代码更简洁
  4. 链式调用提升可读性:整个逻辑从数据筛选到最终排序一气呵成,代码流程清晰明了

额外优化:处理空白标签

如果你的标签字段可能存在空字符串(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:14