如何更有效地重写它(linq with split)?

时间:2012-08-23 15:42:50

标签: linq simplify

这是问题所在: 我有一个专栏的主题格式为:“boston | new york | chicago”。名称可以不同,主题的数量可以在记录中变化。 我需要提出的是使用这些名称的计数来收集相同的名称。

这就是我所做的:

 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();

似乎有很多简单任务的代码。任何想法如何简化这个?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用SelectManyToList

构建列表
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()});

答案 1 :(得分:0)

var groups = queryResult
  .SelectMany(t => t.TopicData.Split('|')
  .GroupBy(n => n)
  .Select(g => new { Key = g.Key, Count = g.Count() });

答案 2 :(得分:0)

查询语法可以很好而紧凑:

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);