2015-12-16 70 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);