C#7模式匹配值不是空的

Kyl*_*Mit 5 c# pattern-matching c#-7.0

我想抓住可枚举的第一个实例,然后在找到的实例上执行一些操作(如果它存在(!= null)).有没有办法简化C#7模式匹配的访问?

采取以下起点:

IEnumerable<Client> clients; /// = new List<Client> {new Client()};
Client myClient = clients.FirstOrDefault();
if (myClient != null)
{
    // do something with myClient
}
Run Code Online (Sandbox Code Playgroud)

我可以将呼叫FirstOrDefault与这样的if statement事情结合起来:

if (clients.FirstOrDefault() is null myClient)
{
    // do something with myClient
}
Run Code Online (Sandbox Code Playgroud)

我没有在MSDN模式匹配Stack Overflow上的其他地方看到任何类似的示例

RB.*_*RB. 9

你绝对可以做到这一点.我的例子使用string但它可以使用相同的Client.

void Main()
{
    IList<string> list = new List<string>();

    if (list.FirstOrDefault() is string s1) 
    {
        Console.WriteLine("This won't print as the result is null, " +
                          "which doesn't match string");
    }

    list.Add("Hi!");

    if (list.FirstOrDefault() is string s2)
    {
        Console.WriteLine("This will print as the result is a string: " + s2);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 确保列表被声明为```var```或```IList <string>```因为如果```IEnumerable <string>````````list.Add```将不起作用 (5认同)
  • 啊......当然.如果它是'not null'你可以用肯定条件测试它实际上是****.谢谢! (4认同)
  • 问题是针对 C#7.0 的。C#8.0 引入了额外的模式。由于该值是强类型为“字符串”,因此我们不需要测试该类型。我们可以使用一个空的属性模式来进行测试。`list.FirstOrDefault() 是 { } s1`。因为,要使属性模式成功,对象必须不为 null,并且我们不实际测试任何属性,因此此处的“{ }”相当于“!= null”。 (4认同)