Wie zählen der vorkommen der eindeutigen Werte im Wörterbuch?
Habe ich ein Wörterbuch mit Doppel-Werten und strings als Schlüssel.
Ich will zählen der vorkommen jedes Wertes, in diesem Wörterbuch, und ich möchte wissen diesem Wert (das ist zum Beispiel wiederholt).
zum Beispiel:
key1, 2
key2, 2
key3, 3
key4, 2
key5, 5
key6, 5
Möchte ich eine Liste:
2 - 3 (times)
3 - 1 (once)
5 - 2 (twice)
Wie kann ich es tun?
- Ein wenig mehr info: verlangen Sie die Anzahl der Werte, die nicht wiederholt werden? Könnten Sie uns ein Beispiel geben von Daten und Ihre gewünschte Ausgabe?
- Test-doubles für die Gleichheit ist eine sehr fragwürdige Praxis. Möchten Sie vielleicht vermeiden, zu erwähnen, wenn Sie wollen eine Antwort. Mit Linq ist Distinct().Count() auf die Werte Eigentum sonst ein Ansatz, der passt zu deinen tags auch.
- Und wie wollen Sie das testen der Gleichheit von doubles hier?
- mögliche Duplikate von Eindeutige Werte in der Dictionary<TKey,TValue>
- Nein, das ist kein dupe, die Frage.
- Ich Stimme Henk Holterman, dies ist ein etwas anderes problem. Ich habe die Frage umformuliert, so dass jetzt ist es vielleicht klarer für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste, was zu beachten ist, dass Sie nicht wirklich Pflege über die Schlüssel des dictionary. Schritt eins ist daher, ignorieren Sie als irrelevant für die Aufgabe in der hand. Wir arbeiten mit der
Values
Eigenschaft des Wörterbuchs und die Arbeit ist viel das gleiche wie für jede andere Sammlung von ganzen zahlen (oder in der Tat jede andere zählbare jede andere Art können wir vergleichen für Gleichheit).Gibt es zwei Allgemeine Ansätze, um dieses problem, die beide die es Wert sind zu wissen.
Die erste verwendet ein anderes Wörterbuch, halten Sie die Zählung der Werte:
Hoffentlich ist das ziemlich einfach. Ein weiterer Ansatz ist komplizierter, aber hat einige Pluspunkte:
(Wir würden wahrscheinlich verwenden
var
anstatt der ausführlichenIEnumerable<IGrouping<int, int>>
, aber es lohnt sich, es wird genau erläutert code).Im direkten Vergleich, diese version unterlegen ist - sowohl schwieriger zu verstehen und weniger effizient. Aber das erlernen dieser Ansatz ermöglicht einige prägnante und effiziente Variante (N) der gleichen Technik, also es lohnt sich zu untersuchen.
GroupBy()
dauert eine Aufzählung und erzeugt weitere enumeration enthält Schlüssel-Wert-Paaren, wobei der Wert eine Aufzählung zu. Die lambda -x => x
bedeutet, dass das, was es ist, gruppiert von selbst, aber wir haben die Flexibilität, für unterschiedliche Gruppierung der Regeln als das. Der Inhaltgrp
sieht ein bisschen aus wie:So, wenn wir eine Schleife durch dieses eine für jede Gruppe ziehen wir die
Key
- und call -Count()
auf die Gruppe, wir bekommen die Ergebnisse, die wir wollen.Nun, im ersten Fall Bauten wir unsere Zählung in einer einzigen O(n) übergeben, während hier bauen wir die Gruppe in eine O(n) passieren, und dann erhalten Sie die Anzahl in einer Sekunde von O(n) übergeben, so dass es viel weniger effizient. Es ist auch ein bisschen schwerer zu verstehen, also warum die Mühe es zu erwähnen?
Gut, die erste ist, dass, wenn wir es verstehen, können wir wiederum die Zeilen:
In:
Ist ziemlich prägnant, und wird idiomatisch. Es ist vor allem schön, wenn wir wollen, dann gehen Sie auf und tun Sie etwas komplizierter mit der Wert-Anzahl Paare wie können wir diese Kette in einem anderen Betrieb.
Die version, die speichert die Ergebnisse in einem Wörterbuch können noch präziser noch:
Dort deine ganze Frage beantwortet, in einer kurzen Zeile, anstatt die 6 (Ausschneiden Kommentare) für die erste version.
(Einige könnten es vorziehen, zu ersetzen
dict.Values.GroupBy(x => x)
mitdict.GroupBy(x => x.Value)
die haben genau die gleichen Ergebnisse sobald wir laufen dieCount()
auf Sie. Wenn Sie nicht sofort sicher, warum, versuchen, es herauszufinden,).Der andere Vorteil ist, dass wir mehr Flexibilität mit
GroupBy
in anderen Fällen. Aus diesen Gründen, Menschen genutzt, um mit HilfeGroupBy
sind sehr wahrscheinlich beginnen Sie mit der ein-Linie Prägnanz derdict.Values.GroupBy(x => x).ToDictinary(g => g.Key, g => g.Count());
und wechseln Sie dann in Ausführlicher, aber mehr effient form der ersten version (wo erhöhen wir mit Laufenden Summen in neue Wörterbuch), wenn es erwies sich als ein performance-hotspot.Noch einfacher wäre:
(Ja, es ist in VB.NET aber Sie sollten nicht viel Mühe zu konvertieren in C# 🙂 )