Linq-запрос в произвольном порядке на основе количества тегов, повторяющихся в списке через запятую - PullRequest
0 голосов
/ 22 января 2020

У меня есть список, как показано ниже

  ID        Tags                 Name
  1   acronym, address            one
  2   applet, abbr, embed         two
  3   iframe, abbr                three
  4   abbr, bgsound, bdo          four
  5   img, acronym                five

Я хочу получить список в порядке, основанном на большинстве повторяющихся тегов Как показано ниже

  ID        Tags                 Name      
  2   applet, abbr, embed         two
  3   iframe, abbr                three      
  4   abbr, bgsound, bdo          four
  1   acronym, address            one
  5   img,  acronym               five

Пожалуйста, помогите мне, как получить он использует c# лямбда-выражение в LINQ.

1 Ответ

0 голосов
/ 23 января 2020

Демонстрация на dotnetfiddle

Вам просто нужно 2 шага:

  1. Сгруппировать каждый tag с количеством повторений соответственно. то есть: {"Key":"abbr","Value":3}
  2. 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"}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...