【问题标题】:Check if List of Structs Contains an element [duplicate]检查结构列表是否包含元素[重复]
【发布时间】:2016-06-01 13:15:13
【问题描述】:

我有 struct Client 和 List of Clients。

struct Client
        {
            public IPEndPoint endpoint;   
            public string ClientName;
        }
List<Client> clientList = new List<Client>();

如何检查我的列表是否包含具有特定名称的客户?我试过这样做

if(clientList.Find(Client => Client.ClientName == userNickname)

但不幸的是它没有返回布尔值。

【问题讨论】:

  • "it doesn't return bool value"是什么意思?这会给您带来编译器错误还是运行时异常?你对该错误文本的研究给了你什么?或者,换句话说:Find() 返回什么,if() 想要什么?你到底想测试什么?
  • 只需一秒钟的谷歌搜索,我们就会发现大量重复...
  • 我想检查我的列表中是否存在具有特定名称的客户端。 Find() 运算符返回整个 Client 对象,我的编译器不允许我在 if 语句中使用它。我在谷歌上搜索,我发誓。我尝试了多种解决方案,但不知何故我必须忽略 Any() 运算符
  • 如果你想使用Find你可以简单地检查Find的结果是不是null:if(clientList.Find(...) != null)
  • 哦,对了。现在我觉得很笨。谢谢大家的帮助。我现在必须羞愧地离开。

标签: c# list struct contains


【解决方案1】:

你可以使用LINQ的Any()方法:

bool contains = clientList.Any(client => client.ClientName == userNickname);

Any 在这种情况下比Find() 更容易,因为Find() 返回Client 的实例。您需要进一步比较(或者像 Jodrell 建议的那样与 default(Client) 进行比较,或者再次比较名称)。

【讨论】:

  • 我无法使用 Contains,因为发生错误“无法将 lambda 表达式转换为类型 'Program.Client',因为它不是委托类型”。但是“任何”都非常完美:)谢谢。
【解决方案2】:

嗯,

if (clientList.Find(Client => Client.ClientName == userNickname).ClientName != userNickname)
...

如果您阅读List&lt;T&gt;.Find 的文档,您会发现如果列表中没有元素为predicate 返回true,则将返回T 的默认值。

显然,如果您想搜索带有 null 名称的 Client,这将不起作用。

用法相当笨拙,并且不适用于结构。考虑将Client 设为一个类或覆盖Client 的相等性或使Client 不可变或只是做其他事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2014-07-31
    • 2022-09-23
    • 2021-12-14
    • 2017-11-20
    • 2014-04-30
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多