我有一个应用程序可以搜索所有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秒。有没有更好的方法可以以提高速度的方式格式化/替换这些字符串? 我正在考虑做一个转换/案例陈述。
答案 0 :(得分:3)
您可以将所有需要的替换信息放入Dictionary<string,string>
...这将删除所有if
逻辑,然后使用非常快速的字典查找从相应的{cleanFeatureName
获取Constants...
{1}}
从本质上讲,您基本上会在启动时填充Dictionary
一次,然后您的代码会查找类似于此:
if (YourDictionary.ContainsKey (featureName))
{
string cleanFeatureName = YourDictionary[featureName];
XElement cleanName = new XElement("Item", cleanFeatureName);
infoTree.Add(cleanName);
}
这样您就不需要任何featureName
具体的if
条款......
如果您从不同的线程访问Dictionary
,那么使用ConcurrentDictionary
这是一个非常快的.NET4及更高版本中可用的线程安全字典实现...
答案 1 :(得分:1)
第一个“如果”的呼叫占比是多少?
我需要知道给你一个完整的答案。如果答案是“最”,那么完全删除该测试可能会更快。无论如何都要试试看。
然而,对于初学者来说,尝试将所有.Equals()更改为.Equals(target,StringComparison.Ordinal),看看是否会产生很大的不同。
您也可以尝试用switch语句替换所有.Equals()。
答案 2 :(得分: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;
}
}