字典的键和值是否按相同顺序枚举?

6

我有一个场景,需要将作为输入发送的字典以逗号分隔的字符串形式发送到存储过程。

我想知道,如果我像下面这样做,是否存在可能会发送字典中给定键的不正确值的情况?

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);
}

如果你在谈论SQL Server存储过程,为什么不使用专门用于保存多个值的类型(如XML或更好的表值参数)来传递数据呢?为什么要在这里进行字符串操作,然后强制数据库进行字符串解析,以便获取数据呢?因此,建议将数据作为逗号分隔的字符串传递给存储过程并不是最佳选择。 - Damien_The_Unbeliever
我正在使用PostgreSQL。 - Silly Volley
3个回答

9

只有在调用之间未对字典进行修改时,才能保证“与相同顺序相同”的顺序。 - user2864740
@user2864740:嗯,我真希望如果他们在获取键和值之间修改字典时,他们足够聪明地意识到自己在做愚蠢的事情。同样,如果另一个线程同时修改字典,也应该注意到这一点。 - Joey

1

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);

0
键也不为空,也不重复(如果发生这种情况,它会抛出异常),因此它不会为特定键发送不正确的值(我认为您担心您将有2个或更多项目具有相同的键,而string.Join将不知道选择哪一个)。 有关Dictionary的更多信息,请参见https://msdn.microsoft.com/en-us/library/k7z0zy8k(v=vs.110).aspx

问题更多的是关于Keys的枚举顺序是否与Values相同,即如果您分别枚举两者,是否在相同索引处匹配键和值将与字典中的映射匹配。 - Joey
我想在你的回复下发表评论而不是新的答案@Joey。你的答案是正确的。 - Mircea Movila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接