基本上,我想是這樣的:C# - 需要一個IDictionary實現,將允許null鍵
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.Add(null, "Nothing");
dict.Add(1, "One");
是否有任何內置到基礎類庫,它允許這樣做?在添加空鍵時,上述代碼將在運行時引發異常。
感謝
基本上,我想是這樣的:C# - 需要一個IDictionary實現,將允許null鍵
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.Add(null, "Nothing");
dict.Add(1, "One");
是否有任何內置到基礎類庫,它允許這樣做?在添加空鍵時,上述代碼將在運行時引發異常。
感謝
你可以儘量避免使用空,創建一個特殊的單值類,做同樣的事情。例如: - 比方說,比如你想關鍵是字符串
public sealed class Nothing
{
public static readonly Nothing Value = new Nothing();
private Nothing() {}
}
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.add(Nothing.Value, "Nothing");
dict.add(1, "One");
如果您打算讓您的收藏更強類型的這種方法將不能工作。由於字符串是密封的,你不能從它繼承來爲null創建一個「特殊值」替代。你的選擇變得更復雜一點。您可以:
另外,你的字典鍵真的需要鍵是object
?這可能會導致微妙的錯誤,因爲在您可能希望將Equals()作爲比較的基礎進行評估時使用了參考平等。
NameValueCollection可以接受一個空鍵,但它不會實現IDictionary。然而,這將是很容易從DictionaryBase派生並提供添加/刪除/索引器等簡單地與內置的東西像替換空:
class MyDictionary : DictionaryBase {
private readonly object nullKey = new object();
void Add(object key, string value) {
if (key == null) { key = nullKey; }
.. call base methods
}
}
這個怎麼樣?
public class NullableDictionnary<T1, T2> : Dictionary<T1, T2>
{
T2 null_value;
public T2 this[T1 key]
{
get
{
if (key == null)
{ return null_value; }
return base[key];
}
set
{
if (key == null)
{ null_value = value; }
else
{ base[key] = value; }
}
}
}
小心所有其他功能,你現在已經失效 - 計數,添加,清除,ContainsKey,ContainsValue等... 我的意思是,如果你只是黑客,好吧,但我不喜歡創建「NullableDictionary」類,如果你打算這樣做。如果黑客明顯是黑客攻擊,那麼稍後您不太可能受到攻擊。 – phillipwei 2010-03-08 19:54:11
這不會編譯 - 「Dictionary
鍵的字面意思是否需要爲NULL?收藏中的關鍵是一個索引。對於一個集合中的索引來說NULL沒有多大意義。
也許創建一個新類
public class ObjectEntry
{
public object objRef;
public string desc;
public ObjectEntry(object objectReference)
{
objRef = objectReference;
if (objRef = null) {desc = "Nothing";}
else {desc = objRef.Description;} //or whatever info you can get from a proper objRef value
}
}
newObj = new ObjectEntry(null);
dict.add(newObj, newObj.desc);
無需不同的實現Dicionary的。
在這裏我的答案請看: https://stackoverflow.com/a/22261282/212272
你也將能夠保持你的字典強類型:
var dict = new Dictionary<NullObject<int?>, string>();
dict[1] = "one int";
dict[null] = "null int";
Assert.AreEqual("one int", dict[1]);
Assert.AreEqual("null int", dict[null]);
只是好奇,你需要這個在哪裏?謝謝 – 2009-12-16 18:58:38