Как переписать его более эффективно (linq с разделением)?

вот проблема: у меня есть колонка с темами в формате: "бостон | нью-йорк | чикаго". Названия могут быть разными, и количество тем в записях может быть разным. Что мне нужно придумать, так это набор одинаковых имен с подсчетом этих имен.

Вот что я сделал:

 var splitted = queryResult.Select(x => x.TopicData);
 List<string> lstOfTopics = new List<string>();
 foreach (var element in splitted)
 {
   string[] splitedTopics = element.Split('|');
   lstOfTopics.AddRange(splitedTopics);
 }
var groupedTopics = lstOfTopics.GroupBy(x => x).Select(group => new {key = group.Key, count = group.Count()}).AsEnumerable();

кажется много кода для простой задачи. любые идеи, как упростить это?

Благодарность!


person HotFrost    schedule 23.08.2012    source источник
comment
Вам нужно обрезать пробелы?   -  person Mark Byers    schedule 23.08.2012


Ответы (2)


Вы можете составить список, используя SelectMany и ToList:

List<string> lstOfTopics = splitted.SelectMany(x => x.Split('|')).ToList();

Вы также можете полностью отказаться от построения списка:

var groupedTopics = queryResult
    .SelectMany(x => x.TopicData.Split('|'))
    .GroupBy(x => x)
    .Select(group => new { group.Key, Count = group.Count()});
person Mark Byers    schedule 23.08.2012

синтаксис запроса может быть красивым и компактным:

var topics =
    from qr in queryResult
    from topic in qr.TopicData.Split('|')
    group topic by topic into g
    select new { Topic = g.Key, Count = g.Count() };

Если вам нужны только уникальные темы, а не их количество...

List<string> topicList = topics.Select(item => item.Topic);
person devgeezer    schedule 24.08.2012