web-dev-qa-db-ja.com

文字列配列に文字列が含まれているかどうかを確認するためのC#の使用

文字列値に文字列配列のWordが含まれているかどうかを確認するには、C#を使用します。例えば、

string stringToCheck = "text1text2text3";

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

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

}

'stringToCheck'の文字列値に配列内のWordが含まれているかどうかを確認する方法はありますか

240
Theomax

ここにあなたがそれをする方法があります:

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

更新: /より良い解決策を探しているのかもしれません.. LINQを利用している以下の@Anton Gogolevの答えを参照してください。

121
Abdel Raoof

方法は次のとおりです。

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

これはstringToCheckstringArrayからの部分文字列のいずれかを含んでいるかどうかをチェックします。すべての部分文字列を確実に含むようにしたい場合は、AnyAllに変更します。

if(stringArray.All(stringToCheck.Contains))
746
Anton Gogolev

これを試して:

LINQを使う必要はありません

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

Linqメソッドを使うだけです:

stringArray.Contains(stringToCheck)
29
Legolas21

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

  bool bol=Array.Exists(stringarray,E => E == stringtocheck);
7
Jze
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

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

おそらくこのようなもの:

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!");
}
5

これを行うには、Linqとmethod groupを使用するのが最も早くよりコンパクトな方法です。

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

独自の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
Kyle Delaney

試してください:

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
Valko

Anton GogolevがstringArray1任意の項目stringArray2任意の項目と一致するかどうかを確認することを提案するのと同じことを行うこともできます。

if(stringArray1.Any(stringArray2.Contains))

同様に、stringArray1のすべての項目は、stringArray2のすべての項目と一致します。

if(stringArray1.All(stringArray2.Contains))
1
Scotty.NET

私はLinqを使いますが、それでもやはり可能です:

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

引数を確認するためにコンソールアプリケーションで次のように使用します。

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

上記の回答を完成するには、 IgnoreCase check useを使用します。

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)
0
Shady Sirhan
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
nakisa

私はこれを作成するために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
vapcguy

私の場合、上記の答えはうまくいきませんでした。配列内の文字列をチェックしてそれをブール値に代入していました。 @Anton Gogolevの答えを修正し、Any()メソッドを削除し、stringToCheckContains()メソッドの中に入れました。

bool = stringArray.Contains(stringToCheck);
0
Matthew Miranda

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

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

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

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

これを試して

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

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

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

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

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

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

0
Pabitra Dash

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内のすべての文字列の長さが同じ場合は、HashSetではなく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
tcb

単純な解決法、linqを必要としない

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

0
user5789849
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);
0
amit jha

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

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

}
0
Amjad Abu Saa