2015-12-16 105 views
0

我有場景,我必須發送字典作爲輸入發送爲逗號分隔字符串存儲過程。字典鍵和值是否以相同的順序枚舉?

我想知道是否我這樣做會有任何可能的情況下,它可能會發送字典中給定的密鑰的不正確的值。

 static void Main(string[] args) 
     { 
      Dictionary<int, string> test = new Dictionary<int, string>(); 
      test.Add(1, "1"); 
      test.Add(3, "3"); 
      test.Add(4, "4"); 
      test.Add(5, "5"); 
      test.Add(2, "2"); 
      JoinTest(test); 

     } 

     private static void JoinTest(Dictionary<int, string> test) 
     { 
      var keys = string.Join(",", test.Keys); 
      var values = string.Join(",", test.Values); 

     } 
+0

「作爲逗號分隔字符串存儲過程」 - 如果你在談論一個SQL Server存儲過程,爲什麼不通過數據跨使用一個類型*設計*保存多個值,如XML或(更好)一個表值參數?爲什麼要在這裏實現字符串綁定,然後強制數據庫執行字符串解鎖,只是爲了獲取數據? –

+0

我正在使用postgre sql –

回答

2

閱讀文檔。它明確規定:

鍵的順序在Dictionary.KeyCollection是不確定的,但它是相同的順序在Dictionary.ValueCollectionValues屬性返回的相關值。

Dictionary.ValueCollection的值的順序是不確定的,但它是相同的順序在Dictionary.KeyCollection所述相關聯的密鑰由Keys屬性返回。

所以是的,鍵和值匹配,但作爲評論者指出,你可能還有其他問題。

+0

只有在調用之間沒有對字典進行任何修改時才能保證「與訂單相同」。 – user2864740

+0

@ user2864740:那麼,我一定會希望,如果他們在獲取關鍵字和值之間修改字典,他們足夠聰明地注意到他們正在做些愚蠢的事情。與從另一個線程同時修改字典一樣。 – Joey

+0

我試着回覆,但刪除了評論 –

0

這些鍵也不是空的,也不是重複的(它會拋出異常,如果發生的話),所以它不會發送特定鍵的incorect值(我認爲你害怕你將有相同的鍵2個或更多項目和字符串。加入將不知道哪一個挑選)。 有關詞典的更多信息,請點擊這裏https://msdn.microsoft.com/en-us/library/k7z0zy8k(v=vs.110).aspx

+0

問題是'Keys'的枚舉順序是否與'Values'相同,也就是說,如果您單獨列舉了兩者,則相同索引中的匹配鍵和值是否匹配字典中的映射。 – Joey

+0

我想在您的回覆中發表評論,而不是一個新答案@Joey。你的答案是正確的。 –

0

Joey的答案是正確的,但只有在沒有對字典進行修改的情況下才能保證順序,正如註釋中指出的那樣。如果你想確保順序是你可以做這樣相同的:

var dictionary = new Dictionary<int, string>(); 
var listOfKeyValuePairs = dictionary.ToList(); 
var keys = listOfKeyValuePairs.Select(kvp => kvp.Key); 
var values = listOfKeyValuePairs.Select(kvp => kvp.Value);