Ich schreibe eine Funktion, die irgendeine Art von Eingabedatenstruktur benötigt (wahrscheinlich eine DataTable; sie liegt immer noch in der Luft, aber der wichtige Teil ist, dass ihre Struktur gewonnen hat) t bis zur Laufzeit definiert sein und eine seiner String-Spalten in Token-Listen aufteilen. Das Endergebnis wird eine Datenstruktur sein (möglicherweise ein Dictionary, aber es liegt immer noch in der Luft), die einen schnellen Abruf dieser Tokenlisten basierend auf dem Primärschlüssel aus der ursprünglichen Datenstruktur ermöglicht.Wörterbuch mit zusammengesetztem Schlüssel, der zur Kompilierungszeit nicht definiert ist
Normalerweise würden Sie ein Tuple für einen zusammengesetzten Schlüssel verwenden, aber da dies ein Werkzeug sein soll, das eine Verbindung zu einer Datenbank herstellt und beliebige Tabellen/Abfragen abruft, kann ich diesen Ansatz hier nicht verwenden. Gibt es etwas, das dafür geeignet ist, das in .NET integriert ist, bevor ich meine eigene CompoundKey-Klasse schreibe, um damit umzugehen? Es ist etwas, das an mehreren Stellen in dieser Anwendung auftauchen wird, nicht nur diese spezielle Tokenisierungsfunktion.
Hier ist eine sehr grobe Vorstellung davon, wie die Methode aussehen würde, wobei "object" für welche Klasse auch immer Schlüsselklasse verwendet wird. Beachten Sie, dass die Klasse CompoundKey
(noch) nicht existiert und WordBreakChars entweder string[]
oder char[]
sind, die an anderer Stelle in der Klasse vorbereitet wurden.
public Dictionary<object, string[]> SplitTokens(DataTable table, string split_column) {
Dictionary<object, string[]> Results = new Dictionary<object, string[]>();
DataColumn[] KeyCols = table.PrimaryKey;
if (KeyCols == null || KeyCols.Length == 0) {
throw new ArgumentException("DataTable has no primary key.");
}
foreach (DataRow row in table.Rows) {
string[] tokens = (row[split_column] as string ?? "").Split(WordBreakChars, StringSplitOptions.RemoveEmptyEntries);
CompoundKey key = new CompoundKey();
foreach (DataColumn col in KeyCols) {
key.Add(col.ColumnName, row[col]);
Results.Add(key, tokens);
}
}
return Results;
}
Nun, Verwendung Objekt. Jedes tatsächliche Objekt, das Sie zur Laufzeit verwenden, muss GetHashCode() und Equals() korrekt implementieren. Wie du das machst, liegt ganz bei dir. –
@HansPassant Ja, ich werde wahrscheinlich am Ende das Dictionary einpacken/erweitern und ein paar Verbesserungen vornehmen, um es für den Gleichheitsvergleich geeigneter zu machen. Ich will das einfach nicht machen, wenn .NET hier schon eine elegante und getestete Lösung bietet. Zeit, ILSpy herauszuholen und durch das Dictionary zu schlendern, um zu sehen, wie es GetHashCode() und Equals() sofort implementiert. – db2