c#,哪种编码技术更快?

时间:2009-10-02 10:40:41

标签: c# silverlight-3.0

public static Dictionary<string,List<LookupItem>> dict;

if (dict == null)
{
   dict = IsolatedStorage.GetDropDowns();
   return dict["Priority"]
}
else
   return dict["Priority"];

try
{
   return dict["Priority"];
}
catch(KeyNotFoundException e)
{
   dict = IsolatedStorage.GetDropDowns();
   return dict["Priority"];
}

这是一个silverlight应用程序,我有在单独存储中缓存的下拉列表(如果我必须查询每次查找的wcf服务,那么数据网格将永远显示,我很清楚下拉可能会过时,我有办法通过回调添加/删除新值时更新字典),在我的xaml中,我有一个转换器,它将从dbquery返回的Id转换为相关的LookupItem对象。我知道我永远不应该使用try和catch作为应用程序逻辑的一部分,但我真的需要尽可能快的方法,因此我愿意忽略那个架构禁忌。字典变为空的原因是因为我将字典存储为仲裁类中的静态var,如果用户必须按F5刷新页面,字典将丢失其值,因为重新加载了xap文件和我的缓存页面在登录时执行的将不会执行。“优先级”包含一个List。 LookupItem包含ComboBoxes等所需的键/值。

1)字典是存储此信息的最有效方式吗? 2)两种方法中的哪一种会产生最快的清单回报?

3 个答案:

答案 0 :(得分:8)

嗯,你缺乏支持,但我会把它写成:

if (dict == null)
{
   dict = IsolatedStorage.GetDropDowns();
}
return dict["Priority"];

请注意,您可能需要一些锁定才能使此线程安全。事实上,为什么不把它写成:

public static Dictionary<string,List<LookupItem>> dict 
    = IsolatedStorage.GetDropDowns();

一开始?然后你知道它永远不会是空的。

无论如何,请不要使用第二个想法。检查无效是非常快的,无论如何,你仍然会失败NullReferenceException而不是KeyNotFoundException ......

如果你真的想要根据是否存在密钥而表现不同,你应该使用(假设dict已经非空):

List<LookupItem> list;
if (!dict.TryGetValue("Priority", out list))
{
    // Deal with the key being missing
}
else
{
    return list;
}

我也会质疑你是否需要将其作为“最快的方法”的判断 - 一旦你确定只从WCF执行一次获取,你确定它是真的 a性能瓶颈?如果是这样的话,我会感到震惊。

答案 1 :(得分:1)

  1. 字典似乎是一个 合理的存储方式 数据。
  2. 您的两个代码示例正在测试不同的内容。为确保dict非空,请参阅Jon的回答。
  3. try / catch(KeyNotFoundException)的最佳替代方法是TryGetValue:

    List<LookupItem> priority = null;
    if(!dict.TryGetValue("Priority", out priority))
        throw new ApplicationException("Could not find Priority list.");
    
    return priority;
    

答案 2 :(得分:1)

除了你的第一个例子缺少一些大括号之外,它会更快,因为if-expression几乎没有时间执行,而抛出异常,创建必要的处理程序和遍历堆栈框架是为CLR做更多的工作......

因此,如果您将'dict'字段称为少于500.000次,那么它显然是#1。关于你的第一个问题:我不完全确定,因为我不是WPF的英雄,但通常很少有比这种数据更有效的字典。

顺便说一下:在上面的例子中你不会得到'KeyNotFoundException',但是'NullReferenceException'......