【发布时间】:2011-04-22 15:03:41
【问题描述】:
我有一个已知良好的字典,在运行时我需要创建一个新字典并运行检查以查看它是否具有与已知良好字典相同的键值对(可能以不同的顺序插入) ,如果是则走一条路,否则走另一条路。我不一定需要序列化整个已知良好的字典(例如,我可以使用哈希),但我需要一些磁盘上的数据,这些数据具有关于已知良好字典的足够信息,以便进行比较,如果没有的话娱乐。最快的方法是什么?我可以使用 SortedDictionary,但初始化和添加值所需的时间会影响此任务的速度。
具体例子:
考虑一个看起来像这样的 Dictionary<String,List<String>>(显然没有特定的顺序):
{ {"key1", {"value1", "value2"} }, {"key2", {"value3", "value4"} } }
我创建了一次字典,并在磁盘上保存了某种形式的信息(完整的序列化、哈希等)。然后,在运行时,我执行以下操作:
Dictionary<String,List<String>> d1 = new Dictionary<String,List<String>> ();
Dictionary<String,List<String>> d2 = new Dictionary<String,List<String>> ();
Dictionary<String,List<String>> d3 = new Dictionary<String,List<String>> ();
String key11 = "key1";
String key12 = "key1";
String key13 = "key1";
String key21 = "key2";
String key22 = "key2";
String key23 = "key2";
List<String> value11 = new List<String> {"value1", "value2"};
List<String> value12 = new List<String> {"value1", "value2"};
List<String> value13 = new List<String> {"value1", "value2"};
List<String> value21 = new List<String> {"value3", "value4"};
List<String> value22 = new List<String> {"value3", "value4"};
List<String> value23 = new List<String> {"value3", "value5"};
dict1.add(key11, value11);
dict1.add(key21, value21);
dict2.add(key22, value22);
dict2.add(key12, value12);
dict3.add(key13, value13);
dict3.add(key23, value23);
dict1.compare(fileName); //Should return true
dict2.compare(fileName); //Should return true
dict3.compare(fileName); //Should return false
同样,如果从启动到从 compare() 返回的总时间更快,我可以更改此代码以使用 SortedDictionary(或其他任何东西),但我不能保证排序,我需要一些一致的比较. compare() 可以加载序列化并遍历字典,它可以序列化内存中的字典并将序列化与文件名进行比较,或者它可以做任何其他事情。
【问题讨论】:
-
请确认您正在寻求“价值平等”作为比较?问题的措辞方式我相信是这样,但我想确定。
-
在优化这样的任务时,明确您正在优化的情况会很有帮助。需要优化的常见情况是两个字典相同还是不同?我问的原因是因为一种常见的优化技术是做一个廉价的测试来捕捉 99% 的“不同”案例,然后做一个昂贵的测试来确认身份。如果大多数时候字典确实是相同的,那么显然这不是一个好的优化;廉价的测试只会让你慢下来。
-
Cos Callis:如果对于已知良好字典中的每个 String-List
对,在要检查的字典中有一个 String-List 对具有相同的值字符串作为键和一个具有相同值的字符串的列表与值的顺序相同,那么我想要true,否则为false。 -
Eric Lippert:我希望字典能够在 90% 的情况下匹配,如果它们不匹配,我必须执行昂贵且耗时的启动。
-
@Shea:当然,但这不是我问的。您可以在同一进程中创建两个具有不同策略的字典;我每天都这样做。我们知道字典有相同的政策吗?当两个字典有不同的策略时,不清楚意味着什么是平等的。例如,假设一个字典是 "A"-->{"DEF"} 并且不区分大小写,而另一个字典是 "a"-->{"DEF"}, "A"-->{"DEF"},区分大小写。可以说,这两个字典是相同的; 他们总是同意每个查询。但是它们的大小不同!
标签: c# serialization dictionary