[C#] NameValueCollection에 키가 있는지 확인

키를 반복하지 않고 NameValueCollection에 키가 있는지 확인하는 빠르고 간단한 방법이 있습니까?

Dictionary.ContainsKey () 또는 이와 유사한 것을 찾고 있습니다.

물론 이것을 해결하는 방법에는 여러 가지가 있습니다. 누군가 내 뇌 가려움증을 긁을 수 있는지 궁금합니다.



답변

에서 MSDN :

이 속성은 다음과 같은 경우 null을 반환합니다.

1) 지정된 키를 찾을 수없는 경우

그래서 당신은 할 수 있습니다 :

NameValueCollection collection = ...
string value = collection[key];
if (value == null) // key doesn't exist

2) 지정된 키가 발견되고 연관된 키가 널인 경우.

collection[key]호출 base.Get()base.FindEntry()내부적으로 사용되는 Hashtable성능 O (1)와.


답변

이 방법을 사용하십시오 :

private static bool ContainsKey(this NameValueCollection collection, string key)
{
    if (collection.Get(key) == null)
    {
        return collection.AllKeys.Contains(key);
    }

    return true;
}

NameValueCollection컬렉션에 null값이 포함되어 있는지 여부에 가장 효율적이며 의존하지 않습니다.


답변

나는이 답변 중 어느 것도 옳거나 최적이라고 생각하지 않습니다. NameValueCollection은 null 값과 누락 된 값을 구분할뿐만 아니라 키와 관련하여 대소 문자를 구분하지 않습니다. 따라서 전체 솔루션은 다음과 같습니다.

public static bool ContainsKey(this NameValueCollection @this, string key)
{
    return @this.Get(key) != null
        // I'm using Keys instead of AllKeys because AllKeys, being a mutable array,
        // can get out-of-sync if mutated (it weirdly re-syncs when you modify the collection).
        // I'm also not 100% sure that OrdinalIgnoreCase is the right comparer to use here.
        // The MSDN docs only say that the "default" case-insensitive comparer is used
        // but it could be current culture or invariant culture
        || @this.Keys.Cast<string>().Contains(key, StringComparer.OrdinalIgnoreCase);
}


답변

예, Linq를 사용하여 AllKeys속성 을 확인할 수 있습니다.

using System.Linq;
...
collection.AllKeys.Contains(key);

그러나 Dictionary<string, string[]>확장 방법을 통해 생성 된이 목적에 훨씬 더 적합합니다.

public static void Dictionary<string, string[]> ToDictionary(this NameValueCollection collection)
{
    return collection.Cast<string>().ToDictionary(key => key, key => collection.GetValues(key));
}

var dictionary = collection.ToDictionary();
if (dictionary.ContainsKey(key))
{
   ...
}


답변

NameValueCollection에 지정된 키가 포함되어 있지 않으면 메서드를 반환하므로 메서드 Get를 사용하여 확인할 수 있습니다 .nullnull

MSDN을 참조하십시오 .


답변

컬렉션 크기가 작 으면 rich.okelly에서 제공하는 솔루션을 사용할 수 있습니다. 그러나 큰 모음은 사전의 생성이 키 모음을 검색하는 것보다 눈에 띄게 느려질 수 있음을 의미합니다.

또한 사용 시나리오에서 NameValueCollection이 수정 된 다른 시점에서 키를 검색하는 경우 매번 사전을 생성하는 것이 키 컬렉션을 검색하는 것보다 느릴 수 있습니다.


답변

이것은 새로운 방법을 도입하지 않고도 해결책이 될 수 있습니다.

    item = collection["item"] != null ? collection["item"].ToString() : null;