使用List <string> .Any()查找字符串是否包含项目以及查找匹配项目?

时间:2016-11-14 20:13:50

标签: c# string linq list any

我有一个字符串列表,可以考虑&#39;过滤器&#39;。

例如:

List<string> msgList = new List<string>();
msgList.Add("This sentence contains the word Apple.");
msgList.Add("This doesn't contain any fruits.");
msgList.Add("This does. It's a banana.");

我有另一个字符串列表,其中包含句子。

示例:

foreach(string msg in msgList)
{
    if(filters.Any(msg.Contains))
    {
        // Do something.
    }
}

现在我想找出msgList中哪些项目包含水果。为此,我使用以下代码:

import

我想知道,Linq中有没有办法可以使用类似于List.Any()的方法,我可以检查msgList是否包含水果,如果有,也可以得到与之匹配的水果查询。如果我可以在&#39;过滤器&#39;中获得匹配的索引应该没问题。也就是说,对于循环的第一次迭代,它应返回0(&#39; Apple&#39;的索引),对于第二次迭代返回null或类似负值,对于第三次迭代,它应该返回2(索引)香蕉&#39;)。

我和SO以及Google一起检查过,但无法找到我正在寻找的内容。

4 个答案:

答案 0 :(得分:3)

你想要FirstOrDefault而不是任何。

FirstOrDefault将返回匹配的第一个对象(如果找到),或者返回默认值(通常为null),如果找不到的话。

答案 1 :(得分:2)

List<string> filters = new List<string>() { "Apple", "Orange", "Banana" };

string msg = "This sentence contains the word Apple.";

var fruit = Regex.Matches(msg, @"\w+", RegexOptions.IgnoreCase)
            .Cast<Match>()
            .Select(x=>x.Value)
            .FirstOrDefault(s => filters.Contains(s));

答案 2 :(得分:1)

您可以使用List<T>.Find方法:

foreach (string msg in msgList)
{
    var fruit = filters.Find(msg.Contains);
    if (fruit != null)
    {
        // Do something.
    }
}

答案 3 :(得分:1)

返回元素索引的可能方法

    while read line
        do
                # The SNMP to check the device type outputs on multiple lines, check to ensure we only grab IP's
                getip=$(echo $line | awk '{print $1}')
                if ping -c 1 $getip &> /dev/null
                        then
                        ip=$getip
                        else
                        trash=$getip
                fi
                template="template"
                host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community1 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
                if [ -z "$host_name" ]
                        then
                        host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community2 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
                        if [ -z "$host_name" ]
                                then
                                host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community3 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
                                if [ -z "$host_name" ]
                                        then
                                        host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community4 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
                                        if [ -z "$host_name" ]
                                                then
                                                host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community5 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
                                                if [ -z "$host_name" ]
                                                        then
                                                        host_name=$(echo " Not found ")

                                                fi
                                        fi
                                fi
                        fi
                fi
                echo "
object Host $host_name {
  import \"$template\"
  display_name = $host_name
  address = \"$ip \"
}" 
        done < files/tmp/hosts.tmp > files/tmp/unsorted-hosts.tmp

另请注意,Contains区分大小写,因此香蕉字符串与香蕉字符串不匹配。如果您想要不区分大小写,可以将IndexOf与StringComparison运算符

一起使用