一种计算列表中出现次数的方法

时间:2009-07-16 17:44:42

标签: c# .net-3.5 list count match

是否有一种简单的方法可以将列表中所有元素的出现次数计入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]);
    }
}

5 个答案:

答案 0 :(得分:73)

这样的事情怎么样......

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()),我会用字符串键入我的分组。你可以想象一个不那么简单的例子,而不是用“1”,“2”,“3”进行键控...也许我做了一个函数,它返回“一个”,“两个”,“三个”作为我的键... < / p>

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

所以,这是一个Func,它会接受一个int并返回一个字符串,就像......

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

但是,由于原始问题要求知道原始列表值及其计数,我只是使用整数来键入我的整数分组以使我的示例更简单。

答案 1 :(得分:13)

你可以做一些这样的事情从一系列事物中算起来。

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

答案 2 :(得分:13)

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

这取自linqpad

中的一个例子

答案 3 :(得分:2)

public void printsOccurences(List<String> words)
{
    var selectQuery =
        from word in words
        group word by word into g
        select new {Word = g.Key, Count = g.Count()};
    foreach(var word in selectQuery)
        Console.WriteLine($"{word.Word}: {word.Count}");*emphasized text*
}

答案 4 :(得分:-3)

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