2017-10-12 30 views
2

我有一個NameValueCollection變量queryDictNameValueCollection鍵沒有值

某些鍵沒有值。不過,我想要通過所有鍵,即使它們沒有與它們相關的值。

利用這一點,我得到空的,而不是鍵值名稱,如果爲空值:

foreach (var parameter in queryDict) 
{ 
    key = (string)parameter; 
} 

AllKeys產生的所有結果。

但是我也得到null。看看queryDict的內容,我可以看到字符串的值在那裏...

那麼我怎樣才能訪問所有的密鑰名稱,而無需創建算法?

增加:

這裏是的QueryDict的用鼠標懸停當內容:

{AQB = 1個& NDH = 1個& CID。 & oxygenid}

cid。和oxygenid沒有在循環

發現我充滿這樣說:

string queryString = "AQB=1&ndh=1&cid.&oxygenid"; 
NameValueCollection queryDict = System.Web.HttpUtility.ParseQueryString(queryString); 
+0

一個NameValueCollection中,您可以用相同的鍵添加多個值,但是如果你添加一個鍵一個空值和然後再次讀取具有非空值的相同密鑰,第一個不再可用 – Steve

回答

3

NameValueCollection允許您使用同一個鍵添加多個值,但如果您添加一個空值的鍵,然後再次讀取具有非空值的同一個鍵,則第一個值(空值)沒有更多的可用

讓我們測試的一些場景:

NameValueCollection coll = new NameValueCollection(); 
coll.Add("This", "Test"); 
coll.Add("That", "A value"); 
coll.Add("This", "Not a null"); 

foreach (string p in coll.AllKeys) 
{ 
    Console.WriteLine("Key=" + p + ", Value=[" + (coll[p] ?? "null") + "]"); 
} 

我們得到的,作爲輸出,

Key=This, Value=[Test,Not a null] 
Key=That, Value=[A value] 

所以對象合併了兩個值罪加gle條目用逗號分隔兩個值。 現在讓我們嘗試用

coll.Add("This", null); 
coll.Add("That", "A value"); 
coll.Add("This", "Not a null"); 

輸出是

Key=This, Value=[Not a null] 
Key=That, Value=[A value] 

沒有第一添加的痕跡。爲什麼會發生?只是因爲合併值的Add方法的內部邏輯無法區分null的初始值和第一個add所添加的null。所以它只是用「Not a null」字符串替換空值。

事實上徵求意見的最後添加

coll.Add("This", null); 
coll.Add("That", "A value"); 
// coll.Add("This", "Not a null"); 

我們得到

Key=This, Value=[null] 
Key=That, Value=[A value] 
+0

感謝您的解釋。我試過這段代碼,你說得對。它似乎是由於我填寫它的方式(我對我的文章做了補充)。有沒有辦法使用ParseQueryString,所以沒有值的參數不會被忽略? – Cher

+0

那麼,ParseQueryString會將沒有值的參數視爲空字符串(「」)而不是空值。所以是的,如果沒有值,它會返回一個空字符串的鍵。但是您的示例輸入無效。要正確使用ParseQueryString,您應該有_「AQB = 1&ndh = 1&cid =&oxygenid =」; _ – Steve

+0

特別是,這樣可以更好地解釋您的一些問題。當您將字符串_「AQB = 1&ndh = 1&cid。&oxygenid」_傳遞給ParseQueryString時,您將得到集合中的第三個鍵「null」,並將兩個字符串作爲值「cid」。和「oxygenid」。這似乎表明ParseQueryString無法確定鍵並將輸入用作空鍵的值。 – Steve

0

I would like to go through all keys你應該通過按鍵環路,則:

foreach (var parameter in queryDict.Keys) 
+0

我所做的是相同的。我仍然沒有得到沒有參數的密鑰 – Cher

0

試試這個,看看它是否工作。您可以使用NameValueCollection.AllKeys來循環使用密鑰,而不會返回任何重複。

foreach (var parameter in queryDict.AllKeys) { key = parameter; } 
+0

它沒有返回值爲空的密鑰。它和我所做的一樣。 – Cher

+0

你可能在對象中有'null keys'。 'NameValueCollection'允許重複/空鍵。否則,這應該工作。 – Anonymous

+0

該鍵不爲空。我將在一分鐘內添加queryDict – Cher

0

使用?? ??空合併運算符。如果操作數不爲null,則返回左側的操作數;否則返回右手操作數。

+0

的內容,謝謝!我可以問我在哪裏寫代碼? – Cher