我对C#编程比较陌生(实际上是整个编程),但是我已经构建了一个应用程序来管理我工作的团队使用的服务器上的应用程序池.它完成了它应该做得很好的一切,但我遇到的唯一问题是将以前使用的配置保存到app.config文件中,这样用户就不必每次都手动将它们放入.就目前而言,我可以保存并从文件中加载(以及每组中我需要的所有字符串).
问题是我想在进行粗略检查之前查看组中是否存在Name字符串.app.config部分的示例:
<appSettings>
<add Name="RowName" MachineName="MS-02348" AppSrvName="AppServer" WebSrvName="AppNet"/>
<add Name="RowName2" MachineName="MS-68186" AppSrvName="AppServer2" WebSrvName="AppNet2"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)
所以我目前正在做的加载值的方法是我有一个方法来检索appSettings/add节点并将它们抛出到列表中,然后将值设置为对象的属性.我这样做的原因是我可以有一个仅列出对象名称的下拉列表,然后当我在所选项目上调用方法时,其余信息都可用.
无论如何,我现在遇到的是我想确保如果名称已经存在于app.config中,我会提示用户写另一个名称而不是将其保存到数据库中.拥有两个具有相同"Name"值的子节点会对我的逻辑造成严重破坏.
我试过一个foreach循环遍历列表中的对象,但是不知道有多少个对象,我不知道一个简单的方法,它真的说它确实存在或不存在.我也尝试根据节点中列出的值来定位子节点,但似乎也失败了.我猜这部分是语法,但它似乎与方法列表定义它的方式相匹配.
有什么想法吗?
if (list.Any())
{
// found something!
}
else
{
// found nothing
}
Run Code Online (Sandbox Code Playgroud)
我总是使用Any()它只是因为它是最高性能的. List.Count()通过每个项目并计算它们,但你不关心项目的数量 - 你只关心是否有一个项目. Any()将枚举列表并在找到项目时停止.因此,在极端情况下,在一百万个项目的列表Count()中将枚举每一个项目并返回,同时Any()将枚举一个并返回.
此外,它返回一个bool,这对于更简洁的代码很方便.:)
作为额外的奖励,您可以打电话Any()寻找特定的东西.所以,在一个人的列表中,我可以看看是否有任何21岁以上的人:
if (list.Any(person => person.Age > 21))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
编辑:格式化.
也许这样的事情
var list = new List<AppSettings>();
var item = list.FirstOrDefault(x => x.Name == NameEnteredByUser);
if (item == null)
{
//there is no such item
}
else
{
//notify the user
}
Run Code Online (Sandbox Code Playgroud)
或任何扩展方法:
var list = new List<AppSettings>();
if (list.Any(x => x.Name == NameEnteredByUser))
{
//name exists
}
else
{
//no such name used before
}
Run Code Online (Sandbox Code Playgroud)
作为旁注,在数据库中配置了一个唯一的字段,以便在编程逻辑失败时不会输入记录.db中的损坏数据状态很糟糕.