web-dev-qa-db-ja.com

文字列配列に値が含まれているかどうかをチェックし、含まれている場合はその位置を取得する

私はこの文字列配列を持っています:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

stringArrayvalueが含まれているかどうかを確認します。もしそうなら、私は配列内の位置を見つけたいと思います。

私はループを使いたくありません。誰かが私がこれを行う方法を提案することはできますか?

138
MoShe

あなたは Array.IndexOf メソッドを使うことができます:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}
276
Darin Dimitrov
var index = Array.FindIndex(stringArray, x => x == value)
66
BLUEPIXY

Existsを使うこともできます。

string[] array = { "cat", "dog", "Perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "Perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));
21
Taran

編集:私はあなたが同様にポジションが必要であることに気づいていませんでした。明示的に実装されているため、配列型の値に直接IndexOfを使用することはできません。しかし、あなたは使用することができます:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(これはDarinの答えとして Array.IndexOf を呼び出すのと似ていますが、単なる代替アプローチです。 IList<T>.IndexOf配列で明示的に実装されていますが、気にしないでください...)

11
Jon Skeet

あなたはArray.IndexOf()を使うことができます - 要素が見つからなかったなら、それは-1を返すことに注意してください、そして、あなたはこのケースを処理しなければなりません。

int index = Array.IndexOf(stringArray, value);
5
BrokenGlass

あなたはこのように試すことができます...あなたが位置も知りたいならば、あなたはArray.IndexOf()を使うことができます

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));
4
Enigma State

IMOが配列に与えられた値が含まれているかどうかをチェックする最良の方法は次のようにSystem.Collections.Generic.IList<T>.Contains(T item)メソッドを使うことです:

((IList<string>)stringArray).Contains(value)

完全なコードサンプル:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[]配列は、CountやContainsなど、いくつかのList<T>のメソッドを個人的に実装しています。これは明示的な(プライベートな)実装なので、最初に配列をキャストしないとこれらのメソッドを使用することはできません。これは文字列に対してのみ機能するわけではありません - 要素のクラスがIComparableを実装している限り、このトリックを使用して任意の型の配列に要素が含まれているかどうかをチェックできます。

すべてのIList<T>メソッドがこのように機能するわけではないことに留意してください。配列に対してIList<T>のAddメソッドを使用しようとすると失敗します。

3
pKami

これを試すことができます。この要素を含むインデックスを検索し、インデックス番号をintに設定します。そして、intが-1より大きいかどうかをチェックします。インデックス - 配列は0から始まる.

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }
1
Mayer Spitzer
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}
0
user5248404

再利用のための拡張メソッドを作成しました。

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

それを呼び出す方法:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}
0
james31rock