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


162

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

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

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

ループを使いたくありません。誰もが私がこれをどのように行うかを提案できますか?

回答:


316

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
}

1
...そして私は何ヶ月もforeachを使ってきました。ところで、これはBLUEPIXYの答えよりも計算的に高速ですか?または遅いですか?
Max von Hippel、2015

2
DOESのArray.IndexOf総額についてのケア?します"text1" == "TEXT1"か?
EVIL

Array.IndexOf−1インデックスが0境界の場合にのみ返されます。このケースは壊れるので注意してください!var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
ベンスカビア2017年

これは、完全一致を探している場合に役立ちます。ただし、これは大文字と小文字を区別
カイルチャンピオン

72
var index = Array.FindIndex(stringArray, x => x == value)

7
Array.FindIndex(array、x => x.StartsWith( "insert string here"))
reggaeguitar

1
しかし、それは問題が求めていることではありません。質問は、配列から既知の値をどのように見つけるかを尋ねます。
Karl Gjertsen、2014年

2
@KarlGjertsen アレイ内での位置を特定したい
BLUEPIXY 2014年

これは非常に便利ですが、x.ToUpper()などを実行できることは、私にとって非常に有益でした。
mrshickadance 2015

31

次も使用できます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"));

1
クリーンでシンプルな答え
Aryan Firouzian

個々の値を確認するにはどうすればよいですか?char配列のcharをチェックしようとすると、char変換できないメッセージが表示されましたSystem.Predicate<char>
アーロンフランケ

13

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

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

(これはArray.IndexOfDarinの回答による呼び出しに似ています-単なる代替アプローチです。なぜ配列に明示的に実装されているのかわかりませんが、気にしないでください...)IList<T>.IndexOf


Containsを使用して配列内の世界の位置を見つけるにはどうすればよいですか?
MoShe、2011年

文字列配列Aの文字列項目が別の文字列配列Bに存在することを確認する可能性はありますか?
Murali Murugesan 14

@MuraliMurugesan:あなたが求めているのかはっきりしていない-二つの配列が持っているかどうかを任意の共通の項目を?特定のアイテムは1つですか?(後者の場合、配列にも含まれているという事実は関係ありません。)
Jon Skeet

私はここでstackoverflow.com/a/22812525/1559213と答えようとしました。Html.CheckBox行に対してtrue / falseを返すようになりました。実際には、月の配列と、いくつかの月があるモデルもあります。モデル月が月配列に存在する場合、trueを返す必要があります。ロケット応答をありがとう:)
Murali Murugesan

@MuraliMurugesan:そうですねif (months.Contains(model.Month))
Jon Skeet

5

使用できますArray.IndexOf()-要素が見つからず、このケースを処理する必要がある場合は-1を返します。

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

4

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

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

3

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

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


2
あなたのものは基本的にプリヤンクのものと同じ答えです。これは、OPが要求していた要素のインデックスを提供しません。
reggaeguitar 14

@reggaeguitar同意します!
Si8

それは質問に完全に答えるものではありませんが、が探していたソリューションです。
Auspex

1

これを試すことができ、この要素を含むインデックスを検索して、インデックス番号をintとして設定します。次に、intが-1より大きいかどうかをチェックします。0以上の場合は、そのようなものを見つけたことを意味しますインデックス-配列は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");
            }

0
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

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

   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
}

positionOPが求めているのはどこですか?
Si8

-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}

エラーが発生します。「System.Array」には「contains」の定義が含まれていません。
ePandit

-4

最も簡単で短い方法は次のとおりです。

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

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

3
問題は、配列内のアイテムの位置を見つけることでした...このContains方法では、この情報はありません
Bidou
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.