0
string str = "cat:fox";
string[] strArr = new string[] { "cat", "dog" };

のような文字列がありますstrstrArrその文字列に、正確に「猫」または「犬」のような要素が含まれているかどうかを確認する必要があります。

文字列が「cat:fox」の場合、メソッドは true を返す必要があります。文字列が「dog:fox」の場合、メソッドは true を返す必要があります。

私が試したことは次のとおりです。

string[] split = str.Split(':');
blnReturn = false;

foreach (var item in split)
{
  foreach(var item1 in strArr)
  {
    if(item == item1)
       blnReturn = true;
  }
}

注:-意味は、値がコロンで連結されていることです。その文字列に strArr に存在する値が含まれているかどうかを確認する必要があります。

これをより良く行うにはどうすればよいですか?

アップデート

要件は、str がstr = "cat dfgfg:fox";true を返してはならない場合です。それだけが猫であるべきです。

それ以外の場合は、この方法strData = str.Split(':'); で確認でき、strArr は既に存在します。

条件は、strArr (文字列配列) 内のいずれかのデータが strData (文字列配列) と一致し、true を返す必要があることです。

4

8 に答える 8

3

次のようなメソッドを使用できるEnumerable.Anyようです。

string str = "cat:dog";
string[] strArr = new string[] { "cat", "dog" };

if (strArr.Any(str.Contains))
{
  // Your string contains one the array values
}

もちろん、これも機能catscatssます。定義cat:asdasd:dogのためです。Contains

あなたは言及しませんでしたが、文字列を一致させたくない場合は、正しいものに見えるMarc Gravellの答えcat:asdasd dogをチェックしてください。

于 2013-11-12T08:05:23.933 に答える
2

「猫」と「猫」を区別したい場合は、次のようにすることをお勧めします。

bool Match(string str, string[] strArr)
{
    return strArr.Intersect(str.Split(':')).Any();
}
于 2013-11-12T08:07:40.883 に答える
2

ほとんどの場合、投稿したコードは問題ありません。割り当てを最小限に抑える必要がある場合(タイトなループであるため)、したくないSplit場合は、次のようなものを使用できます。

public static bool ContainsToken(string value, string token, char delimiter = ';')
{
    if (string.IsNullOrEmpty(token)) return false;
    if (string.IsNullOrEmpty(value)) return false;

    int lastIndex = -1, idx, endIndex = value.Length - token.Length, tokenLength = token.Length;
    while ((idx = value.IndexOf(token, lastIndex + 1)) > lastIndex)
    {
        lastIndex = idx;
        if ((idx == 0 || (value[idx - 1] == delimiter))
            && (idx == endIndex || (value[idx + tokenLength] == delimiter)))
        {
            return true;
        }
    }
    return false;
}

次のようなもの:

static bool ContainsAnyOf(string value, string values)
{
    for(int i = 0 ; i < strArr.Length; i++)
    {
        if(ContainsToken(values, value, ':')) return true;
    }
    return false;
}
于 2013-11-12T08:11:35.507 に答える
0

元の文字列を分割して二重ループを作成する必要はありません。

foreach(string s in array)
    if(word.Contains(s))
        return true;
return false;

メソッドで:

public bool ContainsItem(string word, string[] array)
{
    foreach(string s in array)
        if(word.Contains(s))
            return true;                
    return false;
}

//Usage:
var result = ContainsItem(str, strArr);

Enumerable Any()または、次の方法を使用できます。

var result = strArr.Any(s => str.Contains(s));
于 2013-11-12T08:09:53.040 に答える
0

配列の代わりにリストを使用することもできます。

string str = "cat:fox";
List<String> animallist = new List<String>();

animallist.add("cat");
animallist.add("dog");

//Now you can check like

if(animallist.Contains("cat")){

   //do something

}
于 2013-11-12T08:10:16.383 に答える
0

LINQ を使用できます。

bool contains = strArr.Any(pattern => str.Contains(pattern));
于 2013-11-12T08:06:29.220 に答える
0

あなたの試みは正しいです!


で区切られた非常に大きな文字列が:あり、検索操作を頻繁に実行したい場合は、メソッドが O(1) であるため非常に高速であるため、辞書を使用できますContains

var dictionary=str.Split(new char[]{':'})
                  .ToDictionary(x=>x,x=>"");
bool contains=strArr.Any(x=>dictionary.ContainsKey(x));//fast ops
于 2013-11-12T08:11:31.430 に答える
0
var str = "cat:fox";
var strArr = new[] { "cat", "dog" };

var result = strArr.ToList().Where(str.Contains);

の最初の要素にresultは「cat」が含まれます

于 2013-11-12T08:31:06.313 に答える