Czy istnieje szybki i prosty sposób sprawdzenia, czy klucz istnieje w NameValueCollection bez przechodzenia przez niego?
Szukasz czegoś takiego jak Dictionary.ContainsKey () lub podobnego.
Oczywiście istnieje wiele sposobów rozwiązania tego problemu. Zastanawiam się tylko, czy ktoś może pomóc mi w zadrapaniu swędzenia mózgu.
c#
.net
namevaluecollection
Muhammad Yussuf
źródło
źródło
Odpowiedzi:
Z MSDN :
Możesz więc po prostu:
collection[key]
wywołujebase.Get()
wtedy,base.FindEntry()
które wewnętrznie używaHashtable
z wydajnością O (1).źródło
0
równa sięnull
... sryUżyj tej metody:
Jest to najbardziej wydajne dla
NameValueCollection
i nie zależy od tego, czy kolekcja zawieranull
wartości, czy nie.źródło
using System.Linq;
korzystaniu z tego rozwiązania.Nie sądzę, aby żadna z tych odpowiedzi była całkiem poprawna / optymalna. NameValueCollection nie tylko nie rozróżnia wartości null i brakujących wartości, ale także nie rozróżnia wielkości liter w odniesieniu do swoich kluczy. Dlatego uważam, że pełnym rozwiązaniem byłoby:
źródło
Tak, możesz skorzystać z Linq, aby sprawdzić
AllKeys
nieruchomość:Jednak
Dictionary<string, string[]>
znacznie bardziej nadaje się do tego celu, być może utworzony za pomocą metody rozszerzającej:źródło
collection[key]
wewnętrznie używaHashtable
O (1)collection[key]
nie rozróżnia między brakiem klucza a wartością zerową przechowywaną w tym kluczu.Możesz użyć
Get
metody i sprawdzić,null
ponieważ metoda zwróci,null
jeśli NameValueCollection nie zawiera określonego klucza.Zobacz MSDN .
źródło
index
zkey
wywołać metodę. Prawda?Jeśli rozmiar kolekcji jest mały, możesz wybrać rozwiązanie dostarczone przez rich.okelly. Jednak duża kolekcja oznacza, że generowanie słownika może być zauważalnie wolniejsze niż tylko przeszukiwanie kolekcji kluczy.
Ponadto, jeśli Twój scenariusz użycia wyszukuje klucze w różnych punktach w czasie, w których może zostać zmodyfikowana kolekcja NameValueCollection, generowanie słownika za każdym razem może być wolniejsze niż zwykłe przeszukiwanie kolekcji kluczy.
źródło
Może to być również rozwiązanie bez konieczności wprowadzania nowej metody:
źródło
Jak widać w źródłach referencyjnych, NameValueCollection dziedziczy po NameObjectCollectionBase .
Więc bierzesz typ podstawowy, uzyskujesz prywatną tablicę haszującą przez odbicie i sprawdzasz, czy zawiera określony klucz.
Aby to działało również w Mono, musisz zobaczyć, jaka nazwa tablicy hashy jest w mono, co można zobaczyć tutaj (m_ItemsContainer), i uzyskać mono-pole, jeśli początkowe FieldInfo ma wartość null (mono- runtime).
Lubię to
w przypadku ultra-czystego, nieodblaskowego kodu .NET 2.0, możesz zapętlić klucze, zamiast używać tablicy mieszania, ale jest to powolne.
źródło
W VB to:
W C # powinno być po prostu:
Nie jestem pewien, czy powinien to być
null
albo""
ale to powinno pomóc.źródło
Dictionary
struktury danych, jak wMyNameValueCollection[Key]
, a nieMyNameValueCollection(Key)
, która oczekuje wywołania metody.Korzystam z tej kolekcji, kiedy pracowałem w kolekcji małych elementów.
Tam, gdzie jest dużo elementów, myślę, że trzeba użyć „Słownika”. Mój kod:
Lub może użyć tego:
źródło
Należy pamiętać, że klucz może nie być unikatowy, a porównanie zwykle uwzględnia wielkość liter. Jeśli chcesz po prostu uzyskać wartość pierwszego pasującego klucza i nie przejmować się wielkością liter, użyj tego:
źródło
Typ wartości zwracanej: System.Boolean true, jeśli NameValueCollection zawiera klucze, które nie mają wartości null; w przeciwnym razie fałsz. POŁĄCZYĆ
źródło