답변:
에서 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)와.
0
같습니다 null
... sry
이 방법을 사용하십시오 :
private static bool ContainsKey(this NameValueCollection collection, string key)
{
if (collection.Get(key) == null)
{
return collection.AllKeys.Contains(key);
}
return true;
}
NameValueCollection
컬렉션에 null
값이 포함되어 있는지 여부에 가장 효율적이며 의존하지 않습니다.
using System.Linq;
이 솔루션 을 사용할 때 기억하십시오 .
나는이 답변 중 어느 것도 옳거나 최적이라고 생각하지 않습니다. 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))
{
...
}
collection[key]
내부적 Hashtable
으로 O (1)를 사용 하는 동안
collection[key]
존재하지 않는 키와 해당 키에 대해 null 값이 저장되는 것을 구분하지 않습니다.
NameValueCollection에 지정된 키가 포함되어 있지 않으면 메서드를 반환하므로 메서드 Get
를 사용하여 확인할 수 있습니다 .null
null
MSDN을 참조하십시오 .
index
의 key
메소드를 호출 할 수 있습니다. 그렇지 않습니까?
참조 소스에서 볼 수 있듯이 NameValueCollection 은 NameObjectCollectionBase 에서 상속 합니다.
따라서 기본 유형을 사용하고 리플렉션을 통해 개인 해시 테이블을 가져 와서 특정 키가 포함되어 있는지 확인하십시오.
모노에서도 작동하려면 해시 테이블의 이름이 모노인지 확인해야합니다. 여기서 볼 수있는 것 (m_ItemsContainer)이며 초기 FieldInfo가 null 인 경우 모노 필드를 가져옵니다 (mono- 실행 시간).
이렇게
public static class ParameterExtensions
{
private static System.Reflection.FieldInfo InitFieldInfo()
{
System.Type t = typeof(System.Collections.Specialized.NameObjectCollectionBase);
System.Reflection.FieldInfo fi = t.GetField("_entriesTable", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if(fi == null) // Mono
fi = t.GetField("m_ItemsContainer", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
return fi;
}
private static System.Reflection.FieldInfo m_fi = InitFieldInfo();
public static bool Contains(this System.Collections.Specialized.NameValueCollection nvc, string key)
{
//System.Collections.Specialized.NameValueCollection nvc = new System.Collections.Specialized.NameValueCollection();
//nvc.Add("hello", "world");
//nvc.Add("test", "case");
// The Hashtable is case-INsensitive
System.Collections.Hashtable ent = (System.Collections.Hashtable)m_fi.GetValue(nvc);
return ent.ContainsKey(key);
}
}
초순수 비 반사 .NET 2.0 코드의 경우 해시 테이블을 사용하는 대신 키를 반복 할 수 있지만 속도가 느립니다.
private static bool ContainsKey(System.Collections.Specialized.NameValueCollection nvc, string key)
{
foreach (string str in nvc.AllKeys)
{
if (System.StringComparer.InvariantCultureIgnoreCase.Equals(str, key))
return true;
}
return false;
}
VB에서는 다음과 같습니다.
if not MyNameValueCollection(Key) is Nothing then
.......
end if
C #에서는 다음과 같아야합니다.
if (MyNameValueCollection(Key) != null) { }
확실하지가 할 필요가있는 경우 null
또는 ""
하지만이 도움이 될 것입니다.
Dictionary
에서 MyNameValueCollection[Key]
와 같이 데이터 구조 와 유사하다고 생각합니다 MyNameValueCollection(Key)
.
queryItems.AllKeys.Contains(key)
키가 고유하지 않을 수 있으며 비교는 대소 문자를 구분합니다. 첫 번째 일치 키의 값을 얻고 대소 문자를 신경 쓰지 않으려면 다음을 사용하십시오.
public string GetQueryValue(string queryKey)
{
foreach (string key in QueryItems)
{
if(queryKey.Equals(key, StringComparison.OrdinalIgnoreCase))
return QueryItems.GetValues(key).First(); // There might be multiple keys of the same name, but just return the first match
}
return null;
}
NameValueCollection n = Request.QueryString;
if (n.HasKeys())
{
//something
}
반환 값 형식 : System.Boolean NameValueCollection에 null이 아닌 키가 포함되어 있으면 true이고, 그렇지 않으면 false입니다. 그렇지 않으면 거짓입니다. 링크