1

我有一个应用程序可以搜索所有 SharePoint 场功能并查找特定功能。它拉回的名称格式难看,因此我通过比较运行它们以清理它们,然后将它们添加到 Xml 节点中。它是这样的:

    if (featureName.Contains("target feature"))
    {
      if (featureName.Equals(Constants.IMAGING_FEATURE_CACHE_SERVICE))
      {
        string cleanFeatureName = "Caching Service Feature";
        XElement cleanName = new XElement("Item", cleanFeatureName);
        infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_IMAGE_SERVICE))
      {
       string cleanFeatureName = "Imaging Service Feature";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_HEALTH_RULES))
      {
       string cleanFeatureName = "Health Rules";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_INFRASTRUCTURE))
      {
       string cleanFeatureName = "Imaging Infrastructure";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
      if (featureName.Equals(Constants.IMAGING_FEATURE_MONITORING))
      {
       string cleanFeatureName = "Monitoring";
       XElement cleanName = new XElement("Item", cleanFeatureName);
       infoTree.Add(cleanName);
      }
     }

完成此测试平均需要大约 2.3-2.4 秒。有没有更好的方法可以以提高速度的方式格式化/替换这些字符串?我正在考虑做一个 switch / case 语句。

4

3 回答 3

3

您可以将所有需要的替换信息放入Dictionary<string,string>...这将删除所有if逻辑,并留下一个非常快速的字典查找以cleanFeatureName从相应的Constants...

本质上,您基本上会Dictionary在启动时填写一次,然后您的代码将查找类似于以下内容:

if (YourDictionary.ContainsKey (featureName))
{
string cleanFeatureName = YourDictionary[featureName];
XElement cleanName = new XElement("Item", cleanFeatureName);
infoTree.Add(cleanName);
}

这样你就不需要任何featureName特定的if子句......

如果您Dictionary从不同的线程访问,然后使用ConcurrentDictionary它是一个非常快的任何线程安全字典实现在 .NET4 及更高版本中可用...

于 2012-11-13T14:24:38.263 回答
1

对于第一个“如果”为真的电话有多少比例?

我需要知道这一点才能给你一个完整的答案。如果答案是“大多数”,那么完全删除该测试可能会更快。试试看,无论如何。

但是,对于初学者来说,尝试将所有 .Equals() 更改为 .Equals(target, StringComparison.Ordinal) 看看这是否有很大的不同。

您也可以尝试用 switch 语句替换所有 .Equals() 。

于 2012-11-13T14:33:24.857 回答
1

你可以做一些不同的事情来加速你的代码。我确定 switch 语句可能会有所帮助,但关于 string.Equals 你应该知道的一件事是,如果你使用相同的编码,你应该尝试使用 StringComparison Enum 进行重载。使用 Ordinal 或 OrdinalIgnoreCase(如果您不关心大小写)实际上比默认的 Culture 或 InvariantCulture 快得多。如果在具有不同字符集的不同文化机器上工作,这可能会影响您的代码。

if (featureName.Equals(Constants.IMAGING_FEATURE_CACHE_SERVICE, StringComparison.Ordinal))

这是你的 swich 的样子。显然在案例之间填写您的代码,并且在每个案例结束时总是有一个中断(除非返回)。您还需要添加一个默认案例,尽管您可以在其中放置一个中断以不执行任何操作。

if (featureName.Contains("target feature"))
{
    switch(featureName)
    {
        case Constants.IMAGING_FEATURE_CACHE_SERVICE:
            string cleanFeatureName = "Caching Service Feature";
            XElement cleanName = new XElement("Item", cleanFeatureName);
            infoTree.Add(cleanName);
            break;
        case Constants.IMAGING_FEATURE_IMAGE_SERVICE:
            //Code here
            break;
        case Constants.IMAGING_FEATURE_HEALTH_RULES:
            //etc
            break;
        default:
            break;
    }
}
于 2012-11-13T14:36:15.217 回答