计算单词出现的次数--linq

         1、直接给出代码:声明数据,也可以是txt等文件,通过File类的静态方法读取其中的文本,再转换成List<string>数组。

         private static List<string> words = new List<string> 
            { "there", "is", "a", 
                "great", "house", "and", 
                "an", "amazing", "lake", 
                "there", "is", "a", 
                "computer", "running", "a", 
                "new", "query", "there", 
                "is", "a", "great", 
                "server", "ready", "to", 
                "process", 
                "map", "and", "reduce" };

   2、把数据转换成Lookup<T,K>,Lookup和Dictionary字典有点像,其中的一个重要不同点在于,Lookup中的键值对可以重复出现。比如,可以出现键key="key01" 值value=“01”的键值对两次,或者更多次。而Dictionary中的键只能出现一次,就像小时候用的字典一样,要查的汉字总是唯一的。下面这段代码生成的键值对是有一个单词和1组成。

 ILookup<string, int> map = words.AsParallel().ToLookup(p => p, k => 1);

  3、提取结果,Word存储单词,Count存储单词出现个数。

        var reduce = from IGrouping<string, int> wordMap in map
                         select new
                         {
                             Word = wordMap.Key,
                             Count = wordMap.Count()
                         };

    reduce是统计各个单词个数,也可以加入过滤条件,选择符合需要的数据。例如,个数大于1且单词长度大于2的单词个数,只需加入Where条件即可(红色部分),代码如下。

           var reduce = from IGrouping<string, int> wordMap in map
                         where (wordMap.Count()>1&&wordMap.Key.Length>2)
                         select new
                         {
                             Word = wordMap.Key,
                             Count = wordMap.Count()
                         };
            foreach (var item in reduce)
            {
                Console.WriteLine(item.Word + "\t" + item.Count);
            }

        4、输出结果。可以看一下最后输出的结果。

 

posted @ 2014-12-23 11:36  荣码一生  阅读(434)  评论(0编辑  收藏  举报