【问题标题】:FIND item that CONTAINS specific text查找包含特定文本的项目
【发布时间】:2017-04-21 10:39:41
【问题描述】:

我有以下课程

public class Response
{
   public Prompts Prompts { get; set; }
}
public class Prompts
{
    public List<Prompt> prompt { get; set; }
}
public class Prompt
{        
    public object message { get; set; }
    public object details { get; set; }
}

我正在尝试检索 prompt 的消息,其 message 包含“Hello”。但它给了我错误:

无法从 Prompt 隐式转换为字符串

到目前为止,我尝试了这个 lambda 表达式:

string message = Response.Prompts.prompt.Find(p => p.message.ToString().Contains("Hello")); 

【问题讨论】:

  • “它给了我错误的结果”如果你告诉我们它给你的结果是什么,你不认为这对我们有帮助吗?
  • @rory.ap 问题已编辑
  • 错误发生在哪一行?
  • 一个 error 不是“错误的结果”。它表示您正在尝试将结果存储在错误类型的变量中。将结果存储到Prompt 变量,或使用.message 获取文本。
  • 您已经定义了一个谓词,它在字符串(消息)中搜索一个值,该谓词的结果将返回一个Prompt,但是您说变量消息是string .应该是Prompt message =...

标签: c# linq lambda contains


【解决方案1】:

这行应该返回一个Prompt类型的对象

Prompt pr = Response.Prompts.prompt.Find(p => p.message.ToString().Contains("Hello")); 

如果您只需要访问该属性所需的消息。由于它是object 类型,您需要调用ToString() 方法

string message  = pr.message.ToString();

或将其转换为string

string message  = (string)pr.message;

如果你需要它不区分大小写:

Prompt pr = Response.Prompts.prompt.Find(
       p => p.message.ToString().ToLower().Contains("Hello".ToLower())); 

由于Find(...) 将在未找到匹配项时返回null,因此建议在访问属性时检查它:

string message  = pr != null pr.message.ToString() : "";

【讨论】:

  • 更多 linqy 将是最后的选择。
  • @stuartd 你说得对,我被命名过程弄糊涂了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2012-05-22
  • 2015-02-24
  • 2023-02-21
  • 2017-07-03
相关资源
最近更新 更多