【问题标题】:Counting words in a collection using LINQ使用 LINQ 计算集合中的单词
【发布时间】:2011-03-02 21:05:20
【问题描述】:

我有一个 StringCollection 对象,其中包含 5 个单词。其中3个是重复的单词。我正在尝试创建一个 LINQ 查询,该查询将计算集合中有多少个唯一单词并将它们输出到控制台。因此,例如,如果我的 StringCollection 有 'House'、'Car'、'House'、'Dog'、'Cat',那么它应该输出如下:

房子 --> 2 汽车 --> 1 狗 --> 1 猫 --> 1

关于如何创建 LINQ 查询来执行此操作的任何想法?

【问题讨论】:

  • 你想如何处理套管?
  • 忽略大小写。 cat 和 cat 应视为同一个词
  • 您的所有答案都很棒,除了我似乎没有 .GroupBy 方法。请记住,我使用 System.Collections.Specialized.StringCollection 对象来存储字符串,而不是字符串数组。

标签: c# .net linq .net-3.5


【解决方案1】:
var xs = new StringCollection { "House", "Car", "House", "Dog", "Cat" };

foreach (var g in xs.Cast<string>()
                    .GroupBy(x => x, StringComparer.CurrentCultureIgnoreCase))
{
    Console.WriteLine("{0}: {1}", g.Key, g.Count());
}

【讨论】:

    【解决方案2】:
    foreach(var g in input.GroupBy(i => i.ToLower()).Select(i => new {Word = i.Key, Count = i.Count()})
    {
      Console.WriteLine(string.Format("{0} -> {1}", g.Word, g.Count));
    }
    

    【讨论】:

    • 不!使用 ToLower 进行不区分大小写的字符串比较 == facefalm.jpg
    【解决方案3】:

    应该很简单:

    Console.WriteLine(stringCollection.Distinct().Count());
    

    【讨论】:

    • 这将显示唯一字符串,但不显示重复字符串的数量。
    • 这将计算唯一字符串的数量。所以它会返回4
    • @Ray & @Matthew:是的,OP 询问如何计算有多少个独特的单词。现在该示例已被格式化,我意识到这不是 OP 想要要求的......
    【解决方案4】:

    试试下面的

    var res = from word in col.Cast<string>()
              group word by word into g
              select new { Word = g.Key, Count = g.Count() };
    

    【讨论】:

    • 我相信对group word by word.ToLower() 的简单更改将解决这个问题,当然您的所有密钥都将变为小写。
    • 公平地说,他的答案可能是在添加之前写的。
    • 当我尝试这个时,我得到一个错误。请记住,我使用 System.Collections.Specialized.StringCollection 对象来存储字符串,而不是字符串数组
    • @icemanind 我改变了我的答案来处理弱类型集合。
    • @Taylor,我的答案是在添加大小写要求之前写的。
    【解决方案5】:

    鉴于您正在使用 StringCollection 并希望忽略大小写,您需要将 Enumerable.GroupBy 与 Enumerable.Cast 一起使用:

    var results = collection.Cast<string>.GroupBy(
            i => i,
            (word, words) => new { Word = word, Count = words.Count() },
            StringComparer.CurrentCultureIgnoreCase
        );
    
    foreach(var wordPair in results)
         Console.WriteLine("Word: \"{0}\" - Count: {1}", wordPair.Word, wordPair.Count);
    

    【讨论】:

      【解决方案6】:
      var query =    
        from s in Collection  
        group s by s.Description into g  
        select new {word = g.Key, num = g.Count()};
      

      【讨论】:

        【解决方案7】:

        构建单个字符串值结果...

        var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" };
        var result = stringCollection.Cast<string>().GroupBy(
                                          k => k, 
                                          StringComparer.InvariantCultureIgnoreCase)
                                     .Select(v => v.Key + " -->" + v.Count())
                                     .Aggregate((l,r)=>l+" " + r);
        //result = "House -->2 Car -->1 Dog -->1 Cat -->1"
        

        要将每个值放在不同的行...

        var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" };
        var result = stringCollection.Cast<string>().GroupBy(
                                          k => k, 
                                          StringComparer.InvariantCultureIgnoreCase);
        
        foreach (var value in result)
            Console.WriteLine("{0} --> {1}", value.Key, value.Count());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多