Gibt es eine schnelle und einfache Möglichkeit, um zu überprüfen, ob ein Schlüssel in einer NameValueCollection vorhanden ist, ohne ihn zu durchlaufen?
Suchen Sie nach etwas wie Dictionary.ContainsKey () oder ähnlichem.
Es gibt natürlich viele Möglichkeiten, dies zu lösen. Ich frage mich nur, ob jemand helfen kann, mein Gehirn zu kratzen.
c#
.net
namevaluecollection
Muhammad Yussuf
quelle
quelle
Antworten:
Von MSDN :
Sie können also einfach:
collection[key]
ruftbase.Get()
dann auf,base.FindEntry()
was internHashtable
mit Leistung O (1) verwendet wird.quelle
0
gleichnull
... sryVerwenden Sie diese Methode:
Es ist am effizientesten für
NameValueCollection
und hängt nicht davon ab, ob die Sammlungnull
Werte enthält oder nicht.quelle
using System.Linq;
wenn Sie diese Lösung verwenden.Ich denke nicht, dass eine dieser Antworten ganz richtig / optimal ist. NameValueCollection unterscheidet nicht nur nicht zwischen Nullwerten und fehlenden Werten, sondern unterscheidet auch nicht zwischen Groß- und Kleinschreibung. Daher denke ich, dass eine vollständige Lösung wäre:
quelle
Ja, Sie können Linq verwenden, um die
AllKeys
Eigenschaft zu überprüfen :Ein
Dictionary<string, string[]>
wäre jedoch weitaus besser für diesen Zweck geeignet, möglicherweise über eine Erweiterungsmethode erstellt:quelle
collection[key]
intern verwendet,Hashtable
das ist O (1)collection[key]
nicht zwischen dem nicht vorhandenen Schlüssel und einem für diesen Schlüssel gespeicherten Nullwert unterschieden.Sie können die
Get
Methode verwenden und prüfen, ob dienull
Methode zurückgegeben wird,null
wenn die NameValueCollection den angegebenen Schlüssel nicht enthält.Siehe MSDN .
quelle
index
derkey
die Methode aufzurufen. Nicht wahr?Wenn die Sammlungsgröße klein ist, können Sie die von rich.okelly bereitgestellte Lösung verwenden. Eine große Sammlung bedeutet jedoch, dass die Generierung des Wörterbuchs möglicherweise merklich langsamer ist als nur das Durchsuchen der Schlüsselsammlung.
Wenn Ihr Verwendungsszenario zu verschiedenen Zeitpunkten nach Schlüsseln sucht, zu denen die NameValueCollection möglicherweise geändert wurde, kann das Generieren des Wörterbuchs jedes Mal langsamer sein als das Durchsuchen der Schlüsselsammlung.
quelle
Dies könnte auch eine Lösung sein, ohne eine neue Methode einführen zu müssen:
quelle
Wie Sie sehen in den Bezugsquellen können, Namevaluecollection erbt von Nameobjectcollectionbase .
Sie nehmen also den Basistyp, rufen die private Hashtabelle per Reflektion ab und prüfen, ob sie einen bestimmten Schlüssel enthält.
Damit es auch in Mono funktioniert, müssen Sie den Namen der Hashtabelle in Mono sehen, was Sie hier sehen können (m_ItemsContainer), und das Monofeld abrufen, wenn die anfängliche FieldInfo null ist (Mono- Laufzeit).
So was
Für ultrareinen, nicht reflektierenden .NET 2.0-Code können Sie die Schlüssel durchlaufen, anstatt die Hash-Tabelle zu verwenden. Dies ist jedoch langsam.
quelle
In VB ist es:
In C # sollte nur sein:
Ich bin mir nicht sicher, ob es sein sollte
null
oder""
aber dies sollte helfen.quelle
Dictionary
Datenstruktur, wie inMyNameValueCollection[Key]
, stattMyNameValueCollection(Key)
, die erwartet einen Methodenaufruf.Ich benutze diese Sammlung, als ich in der Sammlung kleiner Elemente gearbeitet habe.
Wo Elemente viel sind, denke ich, muss "Dictionary" verwendet werden. Mein Code:
Oder kann dies verwenden:
quelle
Beachten Sie, dass der Schlüssel möglicherweise nicht eindeutig ist und dass beim Vergleich normalerweise zwischen Groß- und Kleinschreibung unterschieden wird. Wenn Sie nur den Wert des ersten passenden Schlüssels erhalten möchten und sich nicht um die Groß- und Kleinschreibung kümmern möchten, verwenden Sie Folgendes:
quelle
Rückgabewert Typ: System.Boolean true, wenn die NameValueCollection Schlüssel enthält, die nicht null sind; sonst falsch. VERKNÜPFUNG
quelle