Wörterbuch mit mehrere Schlüssel und mehrere Werte für jeden Schlüssel
Hallo alle ich bin eine Anforderung, wo ich Sie zu ordnen, mehrere Schlüssel und mehrere Schlüssel, die ich habe, um die Zuweisung mehrerer Werte
Meine Anforderung ist wie folgt. Ich bin mit EmpID
, PayYr
und PayID
für jeden Mitarbeiter.
Davon ausgehen, ich bekomme meine Daten wie folgt:
EmpID 1000 1000 1000 1000
PayYr 2011 2011 2011 2012
PayID 1 2 3 1
Ich würde gerne meinem Wörterbuch, so dass das dictionary mit key-value-Ergebnis ist wie folgt:
1000 - 2011 - 1,2,3
1000 - 2012 - 1
Versuchte ich etwas, was wie folgt
public struct Tuple<T1, T2>
{
public readonly T1 Item1;
public readonly T2 Item2;
public Tuple(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
}
Beispielcode
for (int empcnt = 0; empcnt < iEmpID.Length; empcnt++)
{
for (int yrcnt = 0; yrcnt < ipayYear.Length; yrcnt++)
{
List<int> lst1 = new List<int>();
var key1 = new Tuple<int, int>(iEmpID[empcnt], ipayYear[yrcnt]);
if (!dictAddValues.ContainsKey(key1))
{
dictAddValues.Add(key1, lst1);
lst1.Add(lst[yrcnt]);
}
}
}
Aber ich bin nicht immer mein Ergebnis, als ich Bedarf, so kann einer mir helfen.
- Was sind Sie sich und wie unterscheidet es sich von dem, was Sie erwarten?
- Ich bin immer nur einzelne Werte mein erwartetes Ergebnis ist
1000 - 2011 - 1,2,3 1000 - 2012 - 1
- Ich bin in der Lage, um Paare von Schlüssel-Werte-aber nicht die Werte, die als pro erforderlich
- Warum erstellen Sie eine Tuple-Klasse, es ist bereits vorhandenen .NET 4.0: msdn.microsoft.com/en-us/library/system.tuple.aspx
- Warum willst du ein Wörterbuch? Kann nicht erstellen Sie eine Mitarbeiter-Klasse und speichern Sie es in eine Liste?
- Manche Menschen sind bestrebt, 3.5, 2.0 oder sogar früheren Versionen .Net.
- Einige Leute, aber die meisten Menschen mit 4.0 weder wissen, dass es bestehende und eignet sich perfekt für solche Anforderungen.
- Wirklich, ich bin nicht sicher, dass die Mehrheit der Menschen ausgerichtet ist 4.0. Jedenfalls ist es gut zu erwähnen die Existenz des
Tuple
Klasse. - Liste würde die Durchsetzung der Schlüssel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich würde ich wahrscheinlich ein Wörterbuch der Wörterbücher, z.B.
IDictionary<int, IDictionary<int, IList<int>>>
. Nicht ich bin mir nicht ganz sicher, wie Sie Sie beabsichtigen, um Zugang oder erleichtern diese Daten; das wird haben einen großen Einfluss auf wie effektiv ist mein Vorschlag. Auf der anderen Seite, es würde Ihnen ermöglichen-relativ leicht-Zugangsdaten, wenn, und nur wenn Sie zugreifen, um Sie einzurichten in Ihren Wörterbüchern.(Am zweiten Gedanken, einfach die Typ-Deklaration selbst ist so hässlich und sinnlos, möchten Sie vielleicht zu überspringen, was ich oben sagte.)
Wenn Sie den Zugriff auf Felder eher zufällig, vielleicht eine einfache denormalisierten
ICollection<Tuple<int, int, int>>
(oder gleichwertig) haben, den trick zu tun, mit aggregation in anderen teilen der Anwendung bei Bedarf. LINQ können hier helfen, eine Menge, vor allem deren aggregation, Gruppierung und lookup-Funktionen.Update: Hoffentlich klärt es:
Nehmen Sie es mit einem Körnchen Salz, wenn; siehe Kommentar.
DataTable
? Ein LINQ-to-SQL Ergebnis? In diesem Fall könnte ich den code viel kürzer (und klarer).data row
aber können Sie mir einen sehr klaren code Sie sagte, Sie ist geschrieben in Anmerkung pad-ich erhalte einige FehlerIch denke, Sie sind fehlt den Comparer Stück. Sehen Sie, wenn Sie den Artikel unten hilft.
Wörterbuch mit einem Benutzerdefinierten Schlüssel
http://www.codeproject.com/Articles/23610/Dictionary-with-a-Custom-Key
Wenn der Schlüssel ein Teil der Klasse dann verwenden KeyedCollection.
Es ist ein Wörterbuch, in dem der Schlüssel abgeleitet wird von dem Objekt.
Unter der Decke ist es Wörterbuch. D nicht zu wiederholen, den Schlüssel in den Schlüssel und den Wert.
Warum nehmen Sie eine chance, der Schlüssel ist nicht gleich Schlüssel als Wert. Nicht zu duplizieren Sie die gleichen Informationen im Speicher.
KeyedCollection-Klasse
Indexer-setzen Sie den zusammengesetzten Schlüssel
Müssen Sie implementieren von Equals und GetHashCode in Ihrem
Tuple
struct:Bin ich mir nicht 100% sicher, dass der genaue Daten, die Sie verwenden möchten, wie einen Schlüssel. Ich denke 2? 2 Integer Werte? Das ist, was nehme ich an, dass unten, aber wenn Sie wollen, drei oder der Typ ist anders, so passen Sie diese entsprechend an. Ich schlage vor, die folgenden (Schritt 1 ist notwendig, Schritt 2 ist optional, aber ich würde es tun)
Schritt 1 Erstellen Sie Ihre eigenen Tastenkombinationen für struct, werden als Schlüssel verwendet, die in einem standard-Wörterbuch. Geben Sie 2 Eigenschaften (oder drei, was auch immer) für Ihre Werte als Schlüssel und/oder ein Konstruktor nehmen/Einstellung dieser Werte.
Geben Sie eine Methode GetHashCode. So etwas wie:
Hinweis: ja, Sie könnte Verwendung eines Tupels. Tupeln . . . nicht so cool wie die ersten zu sein scheinen. Ihre Immobilie-Namen Item1, etc. Nicht sehr klar. Und man oft am Ende, wollte zu überschreiben und hinzufügen, Dinge schnell genug. Einfach von vorne anfangen.
Wie diese:
public struct PayKey {
}
Hinweis: Wenn Ihre mehrere Werte, die Sie verwenden möchten, in Ihrem kombinierten Schlüssel sind Referenz-Typen, sollten Sie wahrscheinlich erstellen Sie eine Klasse statt einer Struktur. Wenn dem so ist, müssen Sie auch überschreiben
Equals
um richtig funktionieren, als dictionary-Schlüssel.(Und fügen Sie öffentliche Eigenschaften für Ihre wichtigsten Werte, wenn Sie nicht bereits haben.)
Oder, wenn Sie, erstellen Sie das benutzerdefinierte Wörterbuch, wie ich unten erwähnen, es würde bequem sein, verwenden Sie eine IEqualityComparer. (Im Grunde, wenn Sie eine Klasse verwenden, wie Ihren Schlüssel, Sie müssen sicherstellen, dass das Wörterbuch wird in zwei identische PayKey Objekt als "gleich". Standardmäßig, sogar mit gleichen Werten, Sie sind Referenzen auf unterschiedliche Objekte, so wird der Rahmen betrachten Sie Sie nicht gleich)
Schritt 2 eine Klasse Erstellen, erbt von Dictionary. Geben es zwei weitere Methoden:
Versuchen, einen Blick auf https://www.nuget.org/packages/Microsoft.Experimental.Collections von microsoft, enthält die MultiValueDictionary geben.