计算列表中发生的方法

有一个简单的方法来计算列表中的所有元素的出现次数到C#中的同一个列表?

像这样的东西:

using System; using System.IO; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Linq; string Occur; List<string> Words = new List<string>(); List<string> Occurrences = new List<string>(); // ~170 elements added. . . for (int i = 0;i<Words.Count;i++){ Words = Words.Distinct().ToList(); for (int ii = 0;ii<Words.Count;ii++){Occur = new Regex(Words[ii]).Matches(Words[]).Count;} Occurrences.Add (Occur); Console.Write("{0} ({1}), ", Words[i], Occurrences[i]); } } 

怎么样这样的事情…

 var l1 = new List<int>() { 1,2,3,4,5,2,2,2,4,4,4,1 }; var g = l1.GroupBy( i => i ); foreach( var grp in g ) { Console.WriteLine( "{0} {1}", grp.Key, grp.Count() ); } 

按照评论编辑:我会尽力做到这一点。 🙂

在我的例子中,它是一个Func<int, TKey>因为我的列表是整数。 所以,我告诉GroupBy如何分组我的项目。 Func接受一个int并返回我的分组的键。 在这种情况下,我将得到一个IGrouping<int,int> (由int键入的一组int)。 如果我把它改成( i => i.ToString() )例如,我将通过一个string键入我的分组。 你可以想象一个比“1”,“2”,“3”键更简单的例子…也许我做一个返回“一”,“二”,“三”的函数是我的键…

 private string SampleMethod( int i ) { // magically return "One" if i == 1, "Two" if i == 2, etc. } 

所以,这是一个Func,会采取一个整数,并返回一个string,就像…

 i => // magically return "One" if i == 1, "Two" if i == 2, etc. 

但是,由于原来的问题要求知道原始列表值和它的数量,我只是用一个整数来键入我的整数分组,使我的例子更简单。

 var wordCount = from word in words group word by word into g select new { g.Key, Count = g.Count() }; 

这是来自linqpad中的一个例子

你可以做这样的事情,从一系列事情中算数。

 IList<String> names = new List<string>() { "ToString", "Format" }; IEnumerable<String> methodNames = typeof(String).GetMethods().Select(x => x.Name); int count = methodNames.Where(x => names.Contains(x)).Count(); 

统计单个元素

 string occur = "Test1"; IList<String> words = new List<string>() {"Test1","Test2","Test3","Test1"}; int count = words.Where(x => x.Equals(occur)).Count(); 

你的外层循环遍历列表中的所有单词。 这是不必要的,会导致你的问题。 删除它,它应该正常工作。