Answers:
从MSDN:
在以下情况下,此属性返回null:
1)如果找不到指定的密钥;
因此,您可以:
NameValueCollection collection = ...
string value = collection[key];
if (value == null) // key doesn't exist
2)如果找到了指定的键,并且其关联的值为null。
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不仅不区分空值和缺失值,而且其键也不区分大小写。因此,我认为完整的解决方案是:
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]
,确实没有在不存在的密钥和针对该密钥存储的空值之间进行区分。
您可以使用该Get
方法并进行检查,null
因为null
如果NameValueCollection不包含指定的键,则该方法将返回。
参见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)
当我在小型元素集合中工作时,我正在使用此集合。
如果元素很多,我认为需要使用“字典”。我的代码:
NameValueCollection ProdIdes;
string prodId = _cfg.ProdIdes[key];
if (string.IsNullOrEmpty(prodId))
{
......
}
或者可以使用这个:
string prodId = _cfg.ProdIdes[key] !=null ? "found" : "not found";
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。否则为假。链接