如何检查String是否包含任何字符串

Sta*_*ros 85 c#

我想在C#中检查String是否包含"a"或"b"或"c".我正在寻找比使用更好的解决方案

if (s.contains("a")||s.contains("b")||s.contains("c"))
Run Code Online (Sandbox Code Playgroud)

Dan*_*Tao 86

好吧,总是这样:

public static bool ContainsAny(this string haystack, params string[] needles)
{
    foreach (string needle in needles)
    {
        if (haystack.Contains(needle))
            return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

用法:

bool anyLuck = s.ContainsAny("a", "b", "c");
Run Code Online (Sandbox Code Playgroud)

但是,没有什么能比得上你的||比较链的表现.

  • 为这个漂亮的解决方案添加新的短语法`public static bool ContainsAny(this string haystack,params string [] needle){return needle.Any(haystack.Contains); }` (9认同)
  • @RollerKostr 它还没有内置到 C# 中,那么为什么要在项目中添加额外的依赖项来实现这样一个简单的解决方案呢? (2认同)

Jef*_*ado 62

这是一个LINQ解决方案,几乎相同但可扩展性更强:

new[] { "a", "b", "c" }.Any(c => s.Contains(c))
Run Code Online (Sandbox Code Playgroud)

  • 这是可扩展的,因为它很容易添加字符,而不是在性能意义上...... :) (3认同)
  • 表现不会很糟糕。无论如何,比解释的正则表达式更好。 (3认同)
  • 啊,是的,当然.也许"更具可扩展性"可能是更好的选择. (2认同)

Jas*_*ams 40

如果您正在寻找单个字符,您可以使用String.IndexOfAny().

如果你想要任意字符串,那么我不知道有一种.NET方法可以"直接"实现,尽管正则表达式可以工作.


小智 36

var values = new [] {"abc", "def", "ghj"};
var str = "abcedasdkljre";
values.Any(str.Contains);
Run Code Online (Sandbox Code Playgroud)


jet*_*hro 21

您可以尝试使用正则表达式

string s;
Regex r = new Regex ("a|b|c");
bool containsAny = r.IsMatch (s);
Run Code Online (Sandbox Code Playgroud)

  • 是什么让人们说正则表达式有点矫枉过正?如果正则表达式被编译一次并且多次使用,并且你的字符串只有c或者c靠近开头而a,b接近结尾,那么正则表达式会更有效率. (3认同)

Mik*_*ver 11

如果您需要具有特定的ContainsAny StringComparison(例如忽略大小写),则可以使用此String Extentions方法.

public static class StringExtensions
{
    public static bool ContainsAny(this string input, IEnumerable<string> containsKeywords, StringComparison comparisonType)
    {
        return containsKeywords.Any(keyword => input.IndexOf(keyword, comparisonType) >= 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法StringComparison.CurrentCultureIgnoreCase:

var input = "My STRING contains Many Substrings";
var substrings = new[] {"string", "many substrings", "not containing this string" };
input.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase);
// The statement above returns true.

”xyz”.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase);
// This statement returns false.
Run Code Online (Sandbox Code Playgroud)

  • 只需一个注释即可改进此答案。你可以用 params 关键字写得更优雅:ContainsAny(this string input, StringComparison compareType, params string [] containsKeywords) 并使用 like input.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase, "string", "many substrings"...等等) (3认同)

小智 6

这是一个"更好的解决方案",非常简单

if(new string[] { "A", "B", ... }.Any(s=>myString.Contains(s)))
Run Code Online (Sandbox Code Playgroud)


Amj*_*Saa 6

List<string> includedWords = new List<string>() { "a", "b", "c" };
bool string_contains_words = includedWords.Exists(o => s.Contains(o));
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 5

public static bool ContainsAny(this string haystack, IEnumerable<string> needles)
{
    return needles.Any(haystack.Contains);
}
Run Code Online (Sandbox Code Playgroud)