回答:
MSDNから:
このプロパティは、次の場合にnullを返します。
1)指定されたキーが見つからない場合。
したがって、次のことができます。
NameValueCollection collection = ...
string value = collection[key];
if (value == null) // key doesn't exist
2)指定されたキーが見つかり、それに関連する値がnullの場合。
collection[key]
base.Get()
次に、パフォーマンスO(1)base.FindEntry()
で内部的に使用Hashtable
する呼び出し。
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);
ただし、a 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値は区別されません。
Get
メソッドを使用して、NameValueCollectionに指定されたキーが含まれていない場合にnull
メソッドが返されるnull
かどうかを確認できます。
MSDNを参照してください。
index
は、を知っている必要がありkey
ます。ね?
あなたは参考情報源に見ることができるように、NameValueCollectionのは、から継承NameObjectCollectionBase。
したがって、基本型を取得し、リフレクションを介してプライベートハッシュテーブルを取得し、特定のキーが含まれているかどうかを確認します。
Monoでも機能するためには、ハッシュテーブルの名前がMonoで何であるかを確認する必要があります。これは、ここで確認できます。(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。リンク