我有一个产品列表,每个产品都有一个字符串字段,其中包含与“#”字符串联的标记列表,如下所示:
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语句等。
答案 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