C#を使用して文字列が文字列配列の文字列を含むかどうかを確認する


290

C#を使用して、文字列値に文字列配列内の単語が含まれているかどうかを確認したいと思います。例えば、

string stringToCheck = "text1text2text3";

string[] stringArray = { "text1", "someothertext", etc... };

if(stringToCheck.contains stringArray) //one of the items?
{

}

「stringToCheck」の文字列値に配列内の単語が含まれているかどうかを確認するにはどうすればよいですか?


1
このブログは、文字列に文字列が含まれているかどうかをテストするための多数の手法をベンチマークしています。blogs.davelozinski.com
Robert Harvey

回答:


145

ここにそれを行う方法があります:

string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
    if (stringToCheck.Contains(x))
    {
        // Process...
    }
}

更新:より良い解決策を探している可能性があります。LINQを利用する以下の@Anton Gogolevの回答を参照してください。


3
おかげで、私はあなたのコードを次のように変更しました:if(stringToCheck.Contains(s))そしてそれはうまくいきました。
Theomax、

5
(stringArray.Contains(stringToCheck))の場合はうまくいきました。
Tamara JQ、2011年

68
この回答を使用しないでください代わりにLINQを使用してください
AlexC

11
文字列配列にContainsメソッドが表示さない人への少しの注意: "using System.Linq;"があるかどうかを確認してください。
コード

5
Linqは常にレガシーソフトウェアで使用できるとは限りません。
William Morrison

842

方法は次のとおりです。

if(stringArray.Any(stringToCheck.Contains))
/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */

これstringToCheckにより、の部分文字列のいずれかが含まれているかどうかがチェックされstringArrayます。すべての部分文字列を確実に含めるには、次のように変更AnyAllます。

if(stringArray.All(stringToCheck.Contains))

115
自己注意:linqは素晴らしい、linqは素晴らしい、linqは素晴らしいです!Gotta 'がlinqを使い始めました。
Fredrik Johansson、

2
@Spooks Linq To Objects(回答の文字列チェックで使用されます)は、.NET 2.0のLinqBridge
David

1
大文字と小文字を区別せずにこれをどのように行いますか?
2013年

14
@OfflerそれはstringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
アントンゴゴレフ2013年

2
配列内のどのアイテムが一致するかを取得する方法は?
ibubi 2017年

44

これを試して:

LINQを使用する必要はありません

if (Array.IndexOf(array, Value) >= 0)
{
    //Your stuff goes here
}

いいね!そして、LinqはArray.IndexOfに比べてどのような利点があるのでしょうか?
Heckflosse_230 2013年

21
これは問題をまったく解決しません。IndexOfは、配列に文字列と完全に一致するものが含まれているかどうかを通知します。元の問題は、文字列が文字列の配列の1つを含んでいるかどうかであり、Linqはこれを簡単に処理できます。
NetMage 2014年

私はこのコメントが遅いことを知っていますが、知らない人にとっては、文字列は文字の配列であるため、文字列型にはIndexOfメソッドが含まれています...したがって、@ NetMageは可能な解決策です。
ブラッキーウルフ

3
@Blacky Wolf、質問を読みましたか?Array.IndexOfは、配列に値が含まれているかどうかを示します。OPは、値が配列のメンバーを含んでいるかどうかを知りたかったのですが、この回答とは正反対です。LinqでString.IndexOfを使用することもできますstringArray.Any(w => stringToCheck.IndexOf(w) >= 0)が、String.Containsを使用したLinqの回答は、まさに求められているものであるため、より理にかなっています。
NetMage 2016年

40

linqメソッドを使用するだけです:

stringArray.Contains(stringToCheck)

4
含まれていますが、拡張メソッドであり、あなたは何をする必要があるusing System.Linq;
isHuman

11
この答えは質問の逆です。
NetMage 2016年

1
この答えはどのようにして何度も賛成されたのですか?質問が出されてから5年後、解決策は基本的に質問の質問とは逆になります。
Fus Ro Dah 2018年

1
変数名を逆にしても大丈夫ですか?
ジャン=フランソワ・ファーブル

8

最も簡単でサンプルの方法。

  bool bol=Array.Exists(stringarray,E => E == stringtocheck);

より良いのはstringarray.Exists(entity => entity == stringtocheck)
MarcelGrügerDec

存在するメソッドを文字列配列から直接呼び出すことはできないと思います.existsメソッドはlist <T>に直接使用できます。したがって、静的メソッドarray.exist <T>を文字列配列に使用する必要があります。ここでチェック=> msdn.microsoft.com/en- us / library / yw84x8be(v = vs.110).aspx
Jze

6
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

if (strNamesArray.Any(x => x == strName))
{
   // do some action here if true...
}

2
これは問題が求めていることではないと思います。
2016

5

このような何か:

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) { 
    return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) {
    Console.WriteLine("Found!");
}

これは、完全一致チェックではなく、リスト内の単語に対する部分文字列チェックであるため、より良いソリューションです。
ロイB

いい答えですが、Linqがなくても最新のC#と比較すると読みにくいです。また、Microsoftは2つの引数を忘れたため、大文字と小文字を無視したくない場合String.Containsよりも優れている可能性があります。検討:String.IndexOfString.ContainsArray.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
NetMage 2016年

3

これを行うには、Linqとメソッドグループを使用するのが最も速く、よりコンパクトな方法です。

var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;

3

独自のstring.ContainsAny()およびstring.ContainsAll()メソッドを定義できます。おまけとして、string.Contains()大文字と小文字を区別しない比較などを可能にするメソッドも導入しました。

public static class Extensions
{
    public static bool Contains(this string source, string value, StringComparison comp)
    {
        return source.IndexOf(value, comp) > -1;
    }

    public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.Any(value => source.Contains(value, comp));
    }

    public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.All(value => source.Contains(value, comp));
    }
}

これらは次のコードでテストできます。

    public static void TestExtensions()
    {
        string[] searchTerms = { "FOO", "BAR" };
        string[] documents = {
            "Hello foo bar",
            "Hello foo",
            "Hello"
        };

        foreach (var document in documents)
        {
            Console.WriteLine("Testing: {0}", document);
            Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine();
        }
    }

2

引数を確認するために、コンソールアプリケーションで以下を使用します

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");

2

私はLinqを使用しますが、それでも次の方法で実行できます。

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);

1

試してください:

String[] val = { "helloword1", "orange", "grape", "pear" };
String sep = "";
string stringToCheck = "word1";

bool match = String.Join(sep,val).Contains(stringToCheck);
bool anothermatch = val.Any(s => s.Contains(stringToCheck));

1

アントンGogolevがいるかどうかを確認するために示唆するように、あなたも同じことを行うことができます任意の項目stringArray1試合任意の項目stringArray2

if(stringArray1.Any(stringArray2.Contains))

同様に、stringArray1のすべてのアイテムはstringArray2のすべてのアイテムと一致します

if(stringArray1.All(stringArray2.Contains))


0

これを試してみてください、ここに例があります:フィールドに配列内の単語が含まれているかどうかを確認します。field(someField)に配列内の単語が含まれているかどうかを確認します。

String[] val = { "helloword1", "orange", "grape", "pear" };   

Expression<Func<Item, bool>> someFieldFilter = i => true;

someFieldFilter = i => val.Any(s => i.someField.Contains(s));

0
public bool ContainAnyOf(string word, string[] array) 
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (word.Contains(array[i]))
            {
                return true;
            }
        }
        return false;
    }

0

Maitrey684によるIndexOfと同様のメソッドを使用して、Theomaxのforeachループを作成しました。(注:最初の3つの「文字列」行は、配列を作成して適切な形式にする方法の単なる例です)。

2つの配列を比較する場合、それらはセミコロンで区切られますが、最後の値の後にはありません。配列の文字列形式にセミコロンを追加すると(つまり、a; b; cはa; b; c;になります)、「x;」を使用して一致させることができます。それがどの位置にあっても:

bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";

foreach (string s in otherArray)
{
    if (myStringArray.IndexOf(s + ";") != -1) {
       found = true;
       break;
    }
}

if (found == true) { 
    // ....
}

0
string [] lines = {"text1", "text2", "etc"};

bool bFound = lines.Any(x => x == "Your string to be searched");

検索された文字列が配列 'lines'のいずれかの要素と一致する場合、bFoundはtrueに設定されます。


0

これを試して

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };

var t = lines.ToList().Find(c => c.Contains(stringToCheck));

それはあなたが探しているテキストの最初の出現を含む行を返します。


0

stringArrayにさまざまな長さの文字列が多数含まれている場合は、Trieを使用して文字列配列を格納および検索することを検討してください。

public static class Extensions
{
    public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
    {
        Trie trie = new Trie(stringArray);
        for (int i = 0; i < stringToCheck.Length; ++i)
        {
            if (trie.MatchesPrefix(stringToCheck.Substring(i)))
            {
                return true;
            }
        }

        return false;
    }
}

これがTrieクラスの実装です

public class Trie
{
    public Trie(IEnumerable<string> words)
    {
        Root = new Node { Letter = '\0' };
        foreach (string word in words)
        {
            this.Insert(word);
        }
    }

    public bool MatchesPrefix(string sentence)
    {
        if (sentence == null)
        {
            return false;
        }

        Node current = Root;
        foreach (char letter in sentence)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
                if (current.IsWord)
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }

        return false;
    }

    private void Insert(string word)
    {
        if (word == null)
        {
            throw new ArgumentNullException();
        }

        Node current = Root;
        foreach (char letter in word)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
            }
            else
            {
                Node newNode = new Node { Letter = letter };
                current.Links.Add(letter, newNode);
                current = newNode;
            }
        }

        current.IsWord = true;
    }

    private class Node
    {
        public char Letter;
        public SortedList<char, Node> Links = new SortedList<char, Node>();
        public bool IsWord;
    }

    private Node Root;
}

内のすべての文字列stringArrayが同じ長さである場合は、aのHashSet代わりにa を使用した方がよいでしょうTrie

public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
    int stringLength = stringArray.First().Length;
    HashSet<string> stringSet = new HashSet<string>(stringArray);
    for (int i = 0; i < stringToCheck.Length - stringLength; ++i)
    {
        if (stringSet.Contains(stringToCheck.Substring(i, stringLength)))
        {
            return true;
        }
    }

    return false;
}

0

シンプルなソリューション、linqは不要

String.Join( "、"、array).Contains(Value + "、");


2
配列の値の1つに区切り文字が含まれている場合はどうなりますか?
Tyler Benzing


0

これを試してください。ループは必要ありません。

string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{

}

0

上記の回答を完了するには、IgnoreCaseチェックを使用します。

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)

それとの一致のインデックスを取得する方法はありますか?ありがとう。
Si8

0

私の場合、上記の答えはうまくいきませんでした。私は配列内の文字列をチェックし、それをブール値に割り当てていました。@Anton Gogolevの回答を変更してAny()メソッドを削除し、メソッドのstringToCheck内部に配置しましたContains()

bool = stringArray.Contains(stringToCheck);


-1

次のコードを使用して、文字列に文字列配列の項目が含まれているかどうかを確認しました。

foreach (string s in stringArray)
{
    if (s != "")
    {
        if (stringToCheck.Contains(s))
        {
            Text = "matched";
        }
    }
}

3
これはText = "matched"、のstringToCheck部分文字列を含む回数だけ設定されますstringArray。あなたは、breakまたはreturn割り当ての後に置くことができます。
Dour High Arch、

-1

3つのオプションが示されています。私は3番目を最も簡潔なものとして見つけることを好みます。

class Program {
    static void Main(string[] args) {
    string req = "PUT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.A");  // IS TRUE
    }
    req = "XPUT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.B"); // IS TRUE
    }
    req = "PUTX";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.C");  // IS TRUE
    }
    req = "UT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.D"); // false
    }
    req = "PU";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.E"); // false
    }
    req = "POST";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("two.1.A"); // IS TRUE
    }
    req = "ASD";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("three.1.A");  // false
    }


    Console.WriteLine("-----");
    req = "PUT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.A"); // IS TRUE
    }
    req = "XPUT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.B"); // false
    }
    req = "PUTX";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.C"); // false
    }
    req = "UT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.D"); // false
    }
    req = "PU";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.E"); // false
    }
    req = "POST";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("two.2.A");  // IS TRUE
    }
    req = "ASD";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("three.2.A");  // false
    }

    Console.WriteLine("-----");
    req = "PUT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.A"); // IS TRUE
    }
    req = "XPUT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.B");  // false
    }
    req = "PUTX";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.C");  // false
    }
    req = "UT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.D");  // false
    }
    req = "PU";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.E");  // false
    }
    req = "POST";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("two.3.A");  // IS TRUE
    }
    req = "ASD";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("three.3.A");  // false
    }

    Console.ReadKey();
    }
}

2番目の2つのオプションでは、最初のオプションと同じことはできません。
カイルデラニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.