문자열 배열에 값이 포함되어 있는지 확인하고 필요한 경우 위치를 가져옵니다.


163

이 문자열 배열이 있습니다.

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

stringArray포함 여부를 결정하고 싶습니다 value. 그렇다면 배열에서 해당 위치를 찾고 싶습니다.

루프를 사용하고 싶지 않습니다. 아무도 내가 어떻게 할 수 있는지 제안 할 수 있습니까?

답변:


317

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를 사용해 왔습니다. BTW는 BLUEPIXY의 답변보다 계산 속도가 빠릅니까? 아니면 느리게?
Max von Hippel

2
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
benscabbia

정확히 일치하는 것을 찾는 경우에 유용합니다. 그러나 대소 문자를 신경 쓰지 않는 경우 유용합니다. Array.IndexOf에 대소 문자를 구분하지 않는 옵션을 추가하는 방법
Kyle Champion

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

7
이것은 람다를 전달하여 Array.FindIndex (array, x => x.StartsWith ( "insert string here"))와 같은 더 복잡한 작업을 수행 할 수 있도록 허용되는 대답이어야합니다.
reggaeguitar

1
그러나 그것은 질문이 요구하는 것이 아닙니다. 이 질문은 배열에서 알려진 값을 어떻게 찾습니까?
Karl Gjertsen

2
@KarlGjertsen 배열에서 그 위치를 찾고 싶습니다
BLUEPIXY

이것은 x.ToUpper ()와 같은 것을 할 수 있다는 것이 매우 유용합니다.
mrshickadance

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>
Aaron Franke

13

편집 : 나는 당신도 위치가 필요하다는 것을 알지 못했습니다. IndexOf명시 적으로 구현되었으므로 배열 유형의 값에 직접 사용할 수 없습니다 . 그러나 다음을 사용할 수 있습니다.

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

(이것은 Array.IndexOfDarin의 답변에 따라 전화하는 것과 유사합니다 -대체 접근법입니다. 왜 명시 적으로 배열 구현 되는지 분명하지 않지만 결코 신경 쓰지 않습니다 ...)IList<T>.IndexOf


Contains를 사용하여 배열에서 세계의 위치를 ​​어떻게 찾을 수 있습니까?
MoShe

문자열 배열 A에서 문자열 항목을 검사 할 가능성이 다른 문자열 배열 B에 존재합니까?
Murali Murugesan

@MuraliMurugesan는 : - 두 개의 배열이 있는지 여부 당신이 요구하는지 분명하지 않다 어떤 공통점이 항목을? 하나의 특정 항목? (후자의 경우 배열에도 있다는 사실은 관련이 없습니다.)
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

배열에 주어진 값이 포함되어 있는지 확인하는 가장 좋은 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
당신은 기본적으로 Priyank와 같은 대답입니다. OP가 요구 한 요소의 색인을 제공하지 않습니다.
reggaeguitar

@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.