C# Config order AppSettings 保存前
C# Config order AppSettings before saving
有没有办法在保存文件之前按键名对 AppSettings 进行排序?
我尝试过的:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
UpdateSetting(config, "LocalLastUpdate", remoteSettingLastUpdated);
config.AppSettings.Settings.AllKeys.OrderBy(r => r); //this will not work b/c it's just the keys
config.Save(ConfigurationSaveMode.Minimal);
private static void UpdateSetting(Configuration config, string name, string value)
{
Log.Debug("Updating Local Settings [" + name + "] -> '" + value + "'");
config.AppSettings.Settings.Remove(name);
config.AppSettings.Settings.Add(name, value);
}
示例:
<appSettings>
<add key="LocalSettingsLastUpdate" value="9/30/2021 11:27:13 PM" />
<add key="Printer_DefaultLogo" value="Y" />
<add key="Signature_Width" value="300" />
</appSettings>
在我 运行 代码将设置添加到配置并点击保存后,我得到了这个:
<appSettings>
<add key="LocalSettingsLastUpdate" value="9/30/2021 11:27:13 PM" />
<add key="Printer_DefaultLogo" value="Y" />
<add key="Signature_Width" value="300" />
<add key="LocalLastUpdate" value="10/1/2021 11:27:14 PM" /> <- this should be at the top
</appSettings>
此代码已在 Visual Studio 中测试并且可以正常工作
public void AddUpdateSortAppSettings(List<(string, string)> newSettings)
{
var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var appSettings = configFile.AppSettings;
if (appSettings.Settings.Count == 0) return ; //error
var settings = new List<(string, string)>();
foreach (var key in appSettings.Settings.AllKeys)
{
settings.Add((appSettings.Settings[key].Key, appSettings.Settings[key].Value));
appSettings.Settings.Remove(key);
}
for (var i = 0; i < newSettings.Count; i++)
{
var found = false;
for (var j = 0; j < settings.Count; j++)
{
if (settings[j].Item1 == newSettings[i].Item1)
{
settings[j] = newSettings[i];
found = true;
}
}
if (!found) settings.Add(newSettings[i]);
}
var existingSettings = settings.OrderBy(i => i.Item1);
foreach (var item in existingSettings)
{
appSettings.Settings.Add(item.Item1, item.Item2);
}
configFile.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
使用它
var newSettings= new List<(string, string)>{("LocalLastUpdate","10/1/2022 11:27:14 PM")};
AddUpdateSortAppSettings(newSettings);
有没有办法在保存文件之前按键名对 AppSettings 进行排序?
我尝试过的:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
UpdateSetting(config, "LocalLastUpdate", remoteSettingLastUpdated);
config.AppSettings.Settings.AllKeys.OrderBy(r => r); //this will not work b/c it's just the keys
config.Save(ConfigurationSaveMode.Minimal);
private static void UpdateSetting(Configuration config, string name, string value)
{
Log.Debug("Updating Local Settings [" + name + "] -> '" + value + "'");
config.AppSettings.Settings.Remove(name);
config.AppSettings.Settings.Add(name, value);
}
示例:
<appSettings>
<add key="LocalSettingsLastUpdate" value="9/30/2021 11:27:13 PM" />
<add key="Printer_DefaultLogo" value="Y" />
<add key="Signature_Width" value="300" />
</appSettings>
在我 运行 代码将设置添加到配置并点击保存后,我得到了这个:
<appSettings>
<add key="LocalSettingsLastUpdate" value="9/30/2021 11:27:13 PM" />
<add key="Printer_DefaultLogo" value="Y" />
<add key="Signature_Width" value="300" />
<add key="LocalLastUpdate" value="10/1/2021 11:27:14 PM" /> <- this should be at the top
</appSettings>
此代码已在 Visual Studio 中测试并且可以正常工作
public void AddUpdateSortAppSettings(List<(string, string)> newSettings)
{
var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var appSettings = configFile.AppSettings;
if (appSettings.Settings.Count == 0) return ; //error
var settings = new List<(string, string)>();
foreach (var key in appSettings.Settings.AllKeys)
{
settings.Add((appSettings.Settings[key].Key, appSettings.Settings[key].Value));
appSettings.Settings.Remove(key);
}
for (var i = 0; i < newSettings.Count; i++)
{
var found = false;
for (var j = 0; j < settings.Count; j++)
{
if (settings[j].Item1 == newSettings[i].Item1)
{
settings[j] = newSettings[i];
found = true;
}
}
if (!found) settings.Add(newSettings[i]);
}
var existingSettings = settings.OrderBy(i => i.Item1);
foreach (var item in existingSettings)
{
appSettings.Settings.Add(item.Item1, item.Item2);
}
configFile.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
使用它
var newSettings= new List<(string, string)>{("LocalLastUpdate","10/1/2022 11:27:14 PM")};
AddUpdateSortAppSettings(newSettings);