如何将字符串数组列表更改为字符串列表

时间:2018-05-26 15:24:37

标签: .net linq

我有一个产品列表,每个产品都有一个字符串字段,其中包含与“#”字符串联的标记列表,如下所示:

  

Tag1中#Tage2#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语句等。

1 个答案:

答案 0 :(得分:2)

这是我的变体:

using System;
using System.Linq;

namespace TagsSplitExample
{
    public class Product
    {
        public bool Active { get; set; }
        public string Tags { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var products = new[]
            {
                new Product{ Active = true, Tags = "Tag1"},
                new Product{ Active = true, Tags = "Tag1#Tag2"},
                new Product{ Active = true, Tags = "Tag1#Tag2#Tag3"},
            };

            var allTags = products
                .Where(p => p.Active && p.Tags != null)
                .Select(p => p.Tags)
                .Select(tags => tags.Split('#'))
                .SelectMany(tag => tag)
                .GroupBy(tag => tag)
                .Select(group => new { Tag = group.Key, Count = group.Count() })
                .OrderByDescending(pair => pair.Count)
                .ToList();

            allTags.ForEach(pair => Console.WriteLine($"{pair.Tag} : {pair.Count}"));

            Console.ReadLine();
        }
    }
}

如果你只需要枚举结果,可以省略Final ToList()。

结果:

Tag1 : 3
Tag2 : 2
Tag3 : 1