C# 如何检查列表中是否存在值?

C# 如何检查列表中是否存在值?,c#,xml,C#,Xml,我对C#编程(实际上是作为一个整体编程)比较陌生,但我已经构建了一个应用程序来管理我的团队使用的服务器上的应用程序池。它做的一切应该都相当好,但我遇到的唯一问题是将以前使用过的配置保存到app.config文件中,这样用户就不必每次都手动将它们放入。目前,我可以出色地保存到文件并从中加载(以及每个组中需要的所有字符串) 问题是,在编写组之前,我想做一个粗略的检查,看看组中是否存在名称字符串。app.config部分的示例: <appSettings> <add Name="R

我对C#编程(实际上是作为一个整体编程)比较陌生,但我已经构建了一个应用程序来管理我的团队使用的服务器上的应用程序池。它做的一切应该都相当好,但我遇到的唯一问题是将以前使用过的配置保存到app.config文件中,这样用户就不必每次都手动将它们放入。目前,我可以出色地保存到文件并从中加载(以及每个组中需要的所有字符串)

问题是,在编写组之前,我想做一个粗略的检查,看看组中是否存在名称字符串。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循环列表中的对象,但在不知道有多少对象的情况下,我不知道一个简单的方法来真正说明它是否存在。我还尝试根据节点中列出的值来定位childnode,但似乎也失败了。我猜这部分是语法,但它似乎与方法列表定义它的方式相匹配


有什么想法吗?

也许是这样的

        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
        }
var list=newlist();
var item=list.FirstOrDefault(x=>x.Name==NameEnteredByUser);
如果(项==null)
{
//没有这样的项目
}
其他的
{
//通知用户
}
或任何扩展方法:

 var list = new List<AppSettings>();
        if (list.Any(x => x.Name == NameEnteredByUser))
        {
            //name exists
        }
        else
        {
            //no such name used before
        }
var list=newlist();
if(list.Any(x=>x.Name==NameEnteredByUser))
{
//名称存在
}
其他的
{
//以前没有用过这样的名字
}

作为旁注,在数据库中配置一个唯一的字段,以便在编程逻辑失败时不会输入记录。数据库中损坏的数据状态不好。

neo112的逻辑正确,但我不确定您遇到的主要问题是否与性能有关,因为您提到您不知道它是否会太长

首先,您还可以执行以下操作:

int count = list.Count(a => a.Name == NameEnteredByUser);
if(count > 0)
{
    // exists
}
我相信.Count()比.First()快(仅限于轶事证据),而且我个人认为它更干净一些

另外,您可以尝试做的另一件事是在添加到appSettings节点时按名称对列表进行排序。然后,您应该实例化一个SortedList,而不仅仅是List,这样也(可能)会影响性能。但是,我不确定排序是否适合您

if (list.Any()) 
{ 
   // found something! 
}
else 
{
   // found nothing 
}
我总是使用
Any()
,因为它是性能最好的
List.Count()
Any()
将枚举整个列表,并在找到项目时停止。因此,在极端情况下,在一个包含一百万项的列表中,
Count()
将枚举每一项并返回,而
Any()
将枚举一项并返回

此外,它还返回bool,这对于更简洁的代码来说非常方便

作为额外的奖励,您可以调用
Any()
查找特定的内容。因此,在一份名单中,我可以查看其中是否有21岁以上的人:

if (list.Any(person => person.Age > 21))
{
   // ...
}

编辑:格式化。

您好,欢迎访问该网站!两件事:您的示例代码在一个
MachineName
属性上缺少结束引号;您可能应该包括处理列表的实际C代码,并详细说明您有哪些具体问题。
但在不知道可能有多少对象的情况下,我不知道…
-这是什么意思?那有什么关系?谢谢你的编辑。我没有复制和粘贴,所以一定错过了那句话!我没有添加任何代码,因为这些代码都不能满足我的需要……这并不是说它不会编译或出现异常,但我想不出一种合乎逻辑的方法来让它工作。我所做的是一个foreach,然后比较每个结果,看看MachineName!=null(MachineName是任意的…只是确保没有返回任何内容)。问题是它会返回3次为假,1次为真。在我的情况下,我想确保所有返回值都为false。我认为您需要使用
FirstOrDefault
而不是
First
。在这种情况下不是这样,因为我正在检查vs null。如果未找到元素,firstordefault将从基构造函数返回一个对象。在这种情况下,获取null表示未找到任何项。根据MSDN,如果没有匹配项,First()将抛出
invalidoOperationException
elements@neo112-我认为kaptan是正确的,当您使用First()时,我的期望是,如果结果集为空,它将抛出一个excation。无论如何,FirstOrDefault更安全。是的,除非显式处理异常,否则您总是希望使用XOrDefault版本。如果没有任何内容,它们将返回null。在您的示例中,它将在if语句之前抛出。也就是说,Any()是一种更好的方法。使用list.Any会比list.Countlist.Count()更快。Count()是一个O(n),list。Any是最坏的O(n),所以你不会赢performance@DarrenYoung说得好,我总是忘了。Any()。从理论上讲,neo112使用标准O符号是正确的。实际上,如果您调用了
Count()
vs.