67 Stimmen

Eine Methode zum Zählen von Vorkommnissen in einer Liste

Gibt es einen einfachen Weg, um die Anzahl der Vorkommen aller Elemente einer Liste in derselben Liste in C# zu zählen?

So etwas wie das:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;

string Occur;
List Words = new List();
List Occurrences = new List();

// ~170 Elemente hinzugefügt. . . 

for (int i = 0;i

117voto

JP Alioto Punkte 44283

Wie wäre es mit so etwas...

var l1 = new List() { 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 nach Kommentar: Ich werde versuchen, diesem gerecht zu werden. :)

In meinem Beispiel handelt es sich um eine Func, weil meine Liste Integers enthält. Also sage ich GroupBy, wie meine Elemente gruppiert werden sollen. Die Func nimmt eine Integer-Zahl entgegen und gibt den Schlüssel für meine Gruppierung zurück. In diesem Fall erhalte ich ein IGrouping (eine Gruppierung von Integers mit einem Integer als Schlüssel). Wenn ich es beispielsweise auf (i => i.ToString()) ändern würde, würde ich meine Gruppierung nach einem String gruppieren. Man kann sich ein weniger triviales Beispiel als eine Gruppierung nach "1", "2", "3" vorstellen...vielleicht erstelle ich eine Funktion, die "eins", "zwei", "drei" zurückgibt, um meine Schlüssel zu bilden...

private string SampleMethod( int i )
{
  // gib magischerweise "Eins" zurück, wenn i == 1, "Zwei" wenn i == 2, etc.
}

Das ist also eine Func, die eine Integer-Zahl entgegennimmt und einen String zurückgibt, genauso wie...

i =>  // gib magischerweise "Eins" zurück, wenn i == 1, "Zwei" wenn i == 2, etc. 

Aber da die ursprüngliche Frage nach dem Wissen um den Wert der Originalliste und dessen Anzahl fragte, habe ich einfach einen Integer verwendet, um meine Integer-Gruppierung zu schlüsseln und mein Beispiel einfacher zu gestalten.

1 Stimmen

+1. Dies ist sehr elegant, um das Vorkommen jedes einzelnen Elements zu zählen.

1 Stimmen

FindAll liefert eine Liste von Elementen aus der Originalliste zurück, die einem Prädikat entsprechen. Daher müssten Sie es einmal für jedes eindeutige Element durchführen, um die Anzahl dieses Elements zu ermitteln.

1 Stimmen

Verwenden Sie es einfach. Tolle Lösung. Wenn Sie es sortieren möchten, verwenden Sie einfach: var g = l1.GroupBy(i => i).OrderByDescending(group => group.Count());.

25voto

Stan R. Punkte 14887

Sie können so etwas tun, um aus einer Liste von Dingen zu zählen.

IList names = new List() { "ToString", "Format" };
IEnumerable methodNames = typeof(String).GetMethods().Select(x => x.Name);

int count = methodNames.Where(x => names.Contains(x)).Count();

Um ein einzelnes Element zu zählen

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

int count = words.Where(x => x.Equals(occur)).Count();

1 Stimmen

+1: Es hat eine Weile gedauert, bis ich herausgefunden habe, dass GetMethods() einfach nur deine Liste von Dingen war. :)

0 Stimmen

Ja, das habe ich auch gedacht und entschieden, es lesbarer zu machen. Danke, obwohl ich die Frage falsch gelesen habe. Es heißt "alle Elemente zählen"..oops. Das sollte immer noch nützlich sein.

0 Stimmen

@StanR. - Diese Lösung funktioniert für mein Problem. Gibt es jedoch eine Methode in der Liste, mit der ich das Vorkommen von größer oder gleich in Worten zählen kann? Ich benutze den Typ "int" anstelle von "string".

15voto

Steve Mitcham Punkte 5131
var wortanzahl =
    from wort in wörter
    group wort by wort into g
    select new { g.Key, Anzahl = g.Count() };    

Dies stammt aus einem der Beispiele im Linqpad

3voto

The Artist Punkte 21
public void printsVorkommen(List wörter)
{
    var wähleAbfrage =
        from wort in wörter
        group wort by wort into g
        select new {Word = g.Key, Count = g.Count()};
    foreach(var wort in wähleAbfrage)
        Console.WriteLine($"{wort.Word}: {wort.Count}");*emphasized text*
}

1voto

Ed H Punkte 1

Dies ist eine Version, die Linq vermeidet, aber nur etwas mehr Code verwendet.

// using System.Collections.Generic;

Dictionary oGroups = new Dictionary();
List oList = new List() { 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 oGroup in oGroups)
{
    Console.WriteLine($"Wert {oGroup.Key} erscheint {oGroup.Value} Mal.");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X