如何使用First()/ FirstOrDefault()?

时间:2015-08-05 19:22:22

标签: c#

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var flame = new string[]
        {
        "bad", "word"
        }

        ;
        var text = "this contains some bad words";
        foreach (string item in text.Split(' '))
        {
            bool testerino = flame.Any(item.Contains);
            if (testerino)
            {
                Console.WriteLine("1");
            }
        }
    }
}

https://dotnetfiddle.net/Widget/as5iTs

我希望Console.WriteLine("1");只运行一次。我尝试使用First()和FirstOrDefault(),但我没有语法错误就无法使用它。我为什么要使用Split?我不知道。这是让.Contains()运行的唯一方法。我使用char item in text Contains()确实收到了错误。

我不需要使用foreach甚至First()这只是我目前所知的方式。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

你想要这样的东西:

var anyFlameWords = 
  text
  .Split(' ')
  .Any(word => flame.Contains(word));
if (anyFlameWords)
    Console.WriteLine("1");

你不需要First / FirstOrDefault,除非你想要集合中的第一个元素,它看你现有的代码并不是你需要的。

答案 1 :(得分:1)

只需在if-case中添加break;

    foreach (string item in text.Split(' '))
    {
        bool testerino = flame.Any(item.Contains);
        if (testerino)
        {
            Console.WriteLine("1");
            break;
        }
    }

break导致立即退出foreach - 循环。

答案 2 :(得分:1)

这个linq可能会有所帮助

bool badWordExists = text.Split(' ').Any(s => flame.Contains(s));

if(badWordExists) Console.WriteLine("1");

答案 3 :(得分:1)

在第一场比赛后你可以休息。

    foreach (string item in text.Split(' '))
    {
        bool testerino = flame.Any(item.Contains);
        if (testerino)
        {
            Console.WriteLine("1");
            break;
        }
    }

但更简洁的替代方案就是

if (test.Split(' ').Any(f=>flame.Contains(f))) Console.WriteLine("1");

如果您有兴趣了解IEnumerable<T>.FirstOrDefault如何在此处使用,请注意您可以将谓词传递给FirstOrDefault以获取IEnumerable<T>中与该谓词匹配的第一项(如果没有匹配,则为T的默认值):

var firstMatch = test.Split(' ').FirstOrDefault(w=>flame.Contains(w));
if (firstMatch != null) Console.WriteLine("1");