我对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>
所以我目前正在做的加载值的方法是我有一个方法来检索appSettings / add节点并将它们抛出到列表中,然后将值设置为对象的属性。我这样做的原因是我可以有一个仅列出对象名称的下拉列表,然后当我在所选项目上调用方法时,其余信息都可用。
无论如何,我现在遇到的是我想确保如果app.config中已经存在Name,我会提示用户写另一个名字而不是将其保存到数据库中。拥有两个具有相同“名称”值的子节点会对我的逻辑造成严重破坏。
我尝试了一个foreach循环遍历列表中的对象,但是不知道有多少个对象,我不知道一个简单的方法,真正说它确实存在或不存在。我也尝试根据节点中列出的值来定位子节点,但似乎也失败了。我猜这部分是语法,但它似乎与方法列表定义它的方式相匹配。
有什么想法吗?
答案 0 :(得分:8)
if (list.Any())
{
// found something!
}
else
{
// found nothing
}
我总是使用Any()
因为它是最高效的。 List.Count()
遍历每个项目并计算它们,但您不关心项目数量 - 您只关心是否有项目。 Any()
将枚举列表并在找到项目时停止。因此,在极端情况下,在一百万个项目的列表中Count()
将枚举每一个项目并返回,而Any()
将枚举一个并返回。
另外,它返回一个bool,这对于更简洁的代码很方便。 :)
作为额外的奖励,您可以致电Any()
寻找具体的事情。因此,在一个人的列表中,我可以查看是否有任何超过21岁的人:
if (list.Any(person => person.Age > 21))
{
// ...
}
编辑:格式化。
答案 1 :(得分:5)
也许是这样的
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
}
或Any扩展方法:
var list = new List<AppSettings>();
if (list.Any(x => x.Name == NameEnteredByUser))
{
//name exists
}
else
{
//no such name used before
}
作为旁注,在数据库中配置了一个唯一的字段,以便在编程逻辑失败时不会输入记录。 db中的损坏数据状态不好。
答案 2 :(得分:1)
neo112在他的逻辑中是正确的,但我不确定你的主要问题是否与性能有关,因为你提到你不知道它是否会变得太长。
首先,您还可以执行以下操作;
int count = list.Count(a => a.Name == NameEnteredByUser);
if(count > 0)
{
// exists
}
我相信.Count()比.First()更快(仅限轶事证据)并且个人认为它更清洁。
另外,您可以尝试做的另一件事是在添加到appSettings节点时按名称对列表进行排序。然后,您应该实例化SortedList而不仅仅是List,那么(也可能)会影响性能。但是,我不确定排序是否适合您。