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

A method to count occurrences in a list

提问人:Nona Urbiz 提问时间:7/17/2009 最后编辑:JimNona Urbiz 更新时间:9/13/2023 访问量:152490

问:

有没有一种简单的方法可以在 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]);
    }
}
C# .NET-3.5 列表 计数 匹配

评论


答:

-4赞 Paul Sonier 7/17/2009 #1

您的外部循环正在循环列表中的所有单词。这是不必要的,会给你带来问题。将其删除,它应该可以正常工作。

25赞 Stan R. 7/17/2009 #2

你可以做这样的事情来从事物列表中计数。

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

评论

1赞 Robert Harvey 7/17/2009
+1:我花了一段时间才弄清楚 GetMethods() 只是你的东西列表。:)
0赞 Stan R. 7/17/2009
是的,我想到了这一点,并决定让它更具可读性。谢谢,虽然我误读了这个问题。它说要计算“所有元素”..哎呀。这应该仍然足够有用。
0赞 Mihir Patel 3/2/2017
@StanR。- 这个解决方案适用于我的问题。但是,列表中有没有一种方法可以计算大于或等于字数的出现次数?我使用的是“int”类型而不是“string”。
0赞 Stan R. 3/2/2017
@MihirPatel只需更改 .在哪里 x > num ||x == 数量
117赞 JP Alioto 7/17/2009 #3

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

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

每条评论编辑:我会尽力伸张正义。:)

在我的例子中,这是一个因为我的列表是整数。所以,我告诉 GroupBy 如何对我的项目进行分组。Func 接受一个 int 并返回我的分组的键。在这种情况下,我会得到一个(由 int 键控的一组 ints)。例如,如果我将其更改为 ( ),我将按字符串键控我的分组。您可以想象一个比通过“1”、“2”、“3”键控更简单的例子......也许我制作了一个返回“一”、“二”、“三”作为我的键的函数......Func<int, TKey>IGrouping<int,int>i => i.ToString()

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赞 Stan R. 7/17/2009
+1.计算每个不同元素的出现次数是非常优雅的。
1赞 JP Alioto 7/17/2009
FindAll 从原始列表中返回与谓词匹配的元素列表,因此您必须对每个唯一元素执行一次操作才能找到该元素的计数。
1赞 aloisdg 4/29/2014
就用它吧。很棒的解决方案。如果要对其进行排序,只需使用 : 。var g = l1.GroupBy( i => i ).OrderByDescending(group => group.Count());
15赞 Steve Mitcham 7/17/2009 #4
var wordCount =
    from word in words
    group word by word into g
    select new { g.Key, Count = g.Count() };    

这是从 linqpad 中的一个示例中获取的

3赞 The Artist 5/17/2020 #5
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*
}
1赞 Ed H 2/16/2022 #6

这是一个避免使用 Linq 但只使用稍微多一点代码的版本。

// using System.Collections.Generic;

Dictionary<int, int> oGroups = new Dictionary<int, int>();
List<int> oList = new List<int>() { 1, 2, 3, 4, 5, 2, 2, 2, 4, 4, 4, 1 };

foreach (int iCurrentValue in oList)
{
    if (oGroups.ContainsKey(iCurrentValue))
        oGroups[iCurrentValue]++;
    else
        oGroups.Add(iCurrentValue, 1);
}

foreach (KeyValuePair<int, int> oGroup in oGroups)
{
    Console.WriteLine($"Value {oGroup.Key} appears {oGroup.Value} times.");
}
0赞 Mojtaba Karimi 4/9/2022 #7

此代码返回一个字典,其中包含世界和实例:

            var wordsDic = Words
            .GroupBy(p => p)
            .ToDictionary(p => p.Key, q => q.Count());
0赞 tejasri B 9/13/2023 #8
        List<int> list = new List<int>()
        { 1,2,3,4,5,2,2,2,1           
        };

        //int a=0

        var a = list.GroupBy(x => x) ;

        foreach (var y in a)
        {
            Console.WriteLine("The element" + y.Key);
            Console.WriteLine(y.Count());
        }

评论

0赞 Jeremy Caney 9/14/2023
感谢您有兴趣为 Stack Overflow 社区做出贡献。这个问题已经有相当多的答案,包括一个已经得到社区广泛验证的答案。你确定你的方法以前没有给出过吗?如果是这样,解释你的方法有何不同,在什么情况下你的方法可能更受欢迎,和/或为什么你认为前面的答案不够充分,这将是有用的。你能编辑你的答案以提供解释吗?