在c#中执行Windows应用程序,我在其中读取文件夹中的web.config文件并加载appsettings,用户可以在其中编辑它们并应用更改。
我将设置'key'和'value'存储在字典中,并将受影响的值存储在单独的字典中。它运行良好,但需要花费大量时间来应用更改。
我怎样才能加快速度?
这是我的代码
public List<AppSettings> OldAppSetting;
public List<AppSettings> NewAppSetting;
foreach (var oldSetList in OldAppSetting)
{
Document = Document = XDocument.Load(@oldSetList.FilePathProp);
var appSetting = Document.Descendants("add").Select(add => new
{
Key = add.Attribute("key"),
Value = add.Attribute("value")
}).ToArray();
foreach (var oldSet in appSetting)
{
foreach (var newSet in NewAppSetting)
{
if (oldSet.Key != null)
{
if (oldSet.Key.Value == newSet.AppKey)
{
oldSet.Value.Value = newSet.AppValue;
}
}
Document.Save(@oldSetList.FilePathProp);
}
}
}
这里是Appsettings类
public class AppSettings
{
public string AppKey { get; set; }
public string AppValue { get; set; }
public string FilePathProp{ get; set; }
}
答案 0 :(得分:2)
我认为您的主要速度问题是您在检查每个项目后保存文档。似乎您可以更改代码以减少调用save的次数。例如:
foreach (var oldSetList in OldAppSetting)
{
Document = Document = XDocument.Load(@oldSetList.FilePathProp);
var appSetting = Document.Descendants("add").Select(add => new
{
Key = add.Attribute("key"),
Value = add.Attribute("value")
}).ToArray();
foreach (var oldSet in appSetting)
{
foreach (var newSet in NewAppSetting)
{
if (oldSet.Key != null)
{
if (oldSet.Key.Value == newSet.AppKey)
{
oldSet.Value.Value = newSet.AppValue;
}
}
}
}
Document.Save(@oldSetList.FilePathProp);
}
此外,您可以为Dictionary<string, AppSetting>
使用appSetting
而不是数组。如果物品数量很大,这会加快速度。这需要对代码进行一些重组。我不知道你的所有类型是什么,所以我不能给你确切的代码,但它看起来像这样:
var appSetting = Document.Descendants("add")
.ToDictionary(add => add.Attribute("key"));
foreach (var newSet in NewAppSetting)
{
if (appSetting.ContainsKey(newSet.AppKey))
{
var oldSet = appSetting[newSet.AppKey];
oldSet.Value.Value = newSet.AppValue;
}
}
你的代码有点令人困惑,但我认为这是对的。这里的想法是构建旧值的字典,以便我们可以在扫描新值时直接查找它们。它将您的O(n ^ 2)算法转换为O(n)算法,如果有很多设置,这将产生差异。此外,代码更小,更容易理解。
答案 1 :(得分:1)
点击
Document.Save(@oldSetList.FilePathProp);
在循环之外!