Ich habe versucht, nach null zu suchen, aber der Compiler warnt davor, dass diese Bedingung niemals auftreten wird. Was soll ich suchen?
Ich habe versucht, nach null zu suchen, aber der Compiler warnt davor, dass diese Bedingung niemals auftreten wird. Was soll ich suchen?
Antworten:
Vorausgesetzt , dass Sie den Wert erhalten möchten , wenn der Schlüssel tut vorhanden ist , verwenden Dictionary<TKey, TValue>.TryGetValue:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Wenn Sie ContainsKeyden Indexer verwenden und dann den Indexer verwenden, wird der Schlüssel zweimal nachgeschlagen, was ziemlich sinnlos ist.)
Beachten Sie, dass , auch wenn Sie wurden Referenztypen verwenden, für null Überprüfung nicht funktionieren würde - der Indexer für Dictionary<,>eine Exception aus , wenn Sie einen fehlenden Schlüssel anfordern, anstatt null zurück. (Dies ist ein großer Unterschied zwischen Dictionary<,>und Hashtable.)
ContainsKey, was wahr ist, weil es auch den Wert extrahieren muss. Es werden jedoch nicht zwei Suchvorgänge durchgeführt.
Das KeyNotFoundWörterbuch löst eine Ausnahme aus, falls das Wörterbuch Ihren Schlüssel nicht enthält.
Wie vorgeschlagen, ContainsKeyist die entsprechende Vorsichtsmaßnahme. TryGetValueist auch wirksam.
Dadurch kann das Wörterbuch den Wert null effektiver speichern. Ohne dieses Verhalten würde die Überprüfung auf ein Null-Ergebnis durch den Operator [] entweder einen Nullwert oder die Nichtexistenz des Eingabeschlüssels anzeigen, was nicht gut ist.
Wenn Sie nur prüfen, bevor Sie versuchen, einen neuen Wert hinzuzufügen, verwenden Sie die folgende ContainsKeyMethode:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Wenn Sie überprüfen, ob der Wert vorhanden ist, verwenden Sie die TryGetValuein der Antwort von Jon Skeet beschriebene Methode.
GetValueElseAddMethoden, mit denen Sie einen Wert (oder a Func<TValue>) angeben, um auch die Auflösung beim Einfügen zu speichern, wenn Sie hinzufügen möchten , wenn diese nicht vorhanden ist. Ich denke, der Grund, warum es nicht in die .NET-Bibliotheken geschafft hat, ist, dass der Add-Pfad weniger häufig ist, wenn Sie ihn in einem Cache-Stil verwenden.]
TryGetValuedies besser wäre, aber wenn Sie überprüfen möchten, ob das Wörterbuch den Schlüssel enthält, um doppelte Ergänzungen zu vermeiden, würde ich sagen, dass dies ContainsKeygenauso gut ist (wenn nicht besser).
Sie sollten nach Dictionary.ContainsKey (int key) suchen, bevor Sie versuchen, den Wert abzurufen.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue. Zum Glück mache ich das jetzt, also werde ich es in Zukunft wissen. Ich werde diese Antwort intakt lassen, obwohl die Diskussion wertvoll ist.
TryGetValueLambda-Ausdruck verwenden konnten. Das lässt mich jedoch denken, dass eine neue Erweiterung von C # ein catchOperator wäre , der dem nullKoaleszenzoperator ähnlich ist .
Eine Helferklasse ist praktisch:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey ist das, wonach Sie suchen.
Sie sollten wahrscheinlich verwenden:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Der Grund, warum Sie nicht nach null suchen können, ist, dass der Schlüssel hier ein Werttyp ist.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Wenn der Schlüssel im Wörterbuch vorhanden ist, gibt er den Wert des Schlüssels zurück, andernfalls wird 0 zurückgegeben.
Hoffe, dieser Code hilft dir.
TryGetValueist genug, verwenden Sie valueanstelle vonresult
Ziehen Sie die Option in Betracht, dieses bestimmte Wörterbuch zu kapseln, und stellen Sie eine Methode bereit, um den Wert für diesen Schlüssel zurückzugeben:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
Dann können Sie das Verhalten dieses Wörterbuchs verwalten.
Zum Beispiel hier: Wenn das Wörterbuch nicht über den Schlüssel verfügt, gibt es den Schlüssel zurück, den Sie als Parameter übergeben.