키를 반복하지 않고 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
를 사용하여 확인할 수 있습니다 .null
null
MSDN을 참조하십시오 .
답변
컬렉션 크기가 작 으면 rich.okelly에서 제공하는 솔루션을 사용할 수 있습니다. 그러나 큰 모음은 사전의 생성이 키 모음을 검색하는 것보다 눈에 띄게 느려질 수 있음을 의미합니다.
또한 사용 시나리오에서 NameValueCollection이 수정 된 다른 시점에서 키를 검색하는 경우 매번 사전을 생성하는 것이 키 컬렉션을 검색하는 것보다 느릴 수 있습니다.
답변
이것은 새로운 방법을 도입하지 않고도 해결책이 될 수 있습니다.
item = collection["item"] != null ? collection["item"].ToString() : null;