-1

我正在用 c# 做一个 Windows 应用程序,我在其中读取文件夹中的 web.config 文件并加载 appsettings,用户可以在其中编辑它们并应用更改。

我将设置“键”和“值”存储在字典中,并将受影响的值存储在单独的字典中。它运行良好,但应用更改需要大量时间。

我怎样才能加快速度?

这是我的代码

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; }



    }
4

2 回答 2

2

我认为您主要的速度问题是您在检查每个项目后保存文档。似乎您可以更改代码以减少调用保存的次数。例如:

    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) 算法,如果有很多设置,这将有所不同。另外,代码更小,更容易理解。

于 2013-07-24T21:10:48.980 回答
1

放在

Document.Save(@oldSetList.FilePathProp); 

圈外!

于 2013-10-09T10:37:21.797 回答