Демонстрация на dotnetfiddle
Вам просто нужно 2 шага:
- Сгруппировать каждый
tag
с количеством повторений соответственно. то есть: {"Key":"abbr","Value":3}
- L oop через данные затем получает наибольшее значение
weight
каждого tags
соответственно. После этого вы можете выбрать результат с помощью OrderByDescending(p => p.Weight)
var data = new []
{
new SampleData{ ID = 1, Tags = new []{ "acronym", "address" }, Name = "one" },
new SampleData{ ID = 2, Tags = new []{ "applet", "abbr", "embed" }, Name = "two" },
new SampleData{ ID = 3, Tags = new []{ "iframe", "abbr" }, Name = "three" },
new SampleData{ ID = 4, Tags = new []{ "abbr", "bgsound", "bdo" }, Name = "four" },
new SampleData{ ID = 5, Tags = new []{ "img", "acronym" }, Name = "five" },
};
var orderedKeyMapping = data.SelectMany(p => p.Tags).GroupBy(tag => tag).ToDictionary(g => g.Key, g => g.Count()).OrderByDescending(p => p.Value);
var result = data.Select(p => new
{
SampleData = p,
Weight = orderedKeyMapping.FirstOrDefault(o => p.Tags.Any(tag => o.Key.Equals(tag))).Value
}).OrderByDescending(p => p.Weight)
.Select(p => p.SampleData);
Console.WriteLine(JsonConvert.SerializeObject(result));
Обновлено
Теги повторяются в списке через запятую , Демонстрация на dotnetfiddle
var orderedKeyMapping = data.SelectMany(p => p.Tags.Split(',')).Select(x => x.Trim())
.GroupBy(tag => tag)
.ToDictionary(g => g.Key.ToString(), g => g.Count())
.OrderByDescending(p => p.Value);
var result = data.Select(p => new
{
SampleData = p,
Weight = orderedKeyMapping.FirstOrDefault(o => p.Tags.Split(',').Select(x => x.Trim()).Any(tag => o.Key.Equals(tag))).Value
}).OrderByDescending(p => p.Weight)
.Select(p => p.SampleData);
Console.WriteLine(JsonConvert.SerializeObject(result));
Выход
[
{"ID":2,"Tags":["applet","abbr","embed"],"Name":"two"},
{"ID":3,"Tags":["iframe","abbr"],"Name":"three"},
{"ID":4,"Tags":["abbr","bgsound","bdo"],"Name":"four"},
{"ID":1,"Tags":["acronym","address"],"Name":"one"},
{"ID":5,"Tags":["img","acronym"],"Name":"five"}
]