Metoda liczenia wystąpień na liście

Czy istnieje prosty sposób na zliczenie liczby wystąpień wszystkich elementów listy do tej samej listy w C#?

Coś takiego:

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]);
    }
}
Author: Jim, 2009-07-16

5 answers

Co powiesz na coś takiego ?..

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

Edit per comment: postaram się zrobić to sprawiedliwie. :)

W moim przykładzie jest to Func<int, TKey> ponieważ moja lista to ints. Więc mówię GroupBy, jak grupować moje przedmioty. Func pobiera int i zwraca klucz dla mojej grupy. W tym przypadku, otrzymam IGrouping<int,int> (grupowanie ints keyed przez int). Gdybym na przykład zmienił ją na (i => i.ToString()), zmieniłbym grupowanie za pomocą ciągu znaków. Można sobie wyobrazić mniej trywialny przykład niż keying przez "1", "2", "3" ... może zrobię funkcję, która zwraca" jeden"," dwa"," trzy", aby być moimi kluczami ...

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

Więc jest to Func, który pobierze int i zwróci ciąg znaków, tak jak ...

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

Ale, ponieważ oryginalne pytanie wymagało znajomości oryginalnej wartości listy i jej liczby, po prostu użyłem liczby całkowitej, aby kluczować moje grupowanie liczb całkowitych, aby mój przykład był prostszy.

 93
Author: JP Alioto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 18:34:47

Możesz zrobić coś takiego, aby policzyć z listy rzeczy.

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

Aby policzyć pojedynczy element

string occur = "Test1";
IList<String> words = new List<string>() {"Test1","Test2","Test3","Test1"};

int count = words.Where(x => x.Equals(occur)).Count();
 21
Author: Stan R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 12:43:52
var wordCount =
    from word in words
    group word by word into g
    select new { g.Key, Count = g.Count() };    

Jest to zaczerpnięte z jednego z przykładów w linqpad

 15
Author: Steve Mitcham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 17:55:54
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*
}
 2
Author: The Artist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-17 10:53:51

Twoja zewnętrzna pętla zapętla wszystkie słowa na liście. Jest to niepotrzebne i spowoduje problemy. Usuń go i powinno działać prawidłowo.

 -4
Author: Paul Sonier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 09:01:59