문자열이 배열입니까?


107

string[]요소가 포함되어 있는지 확인하기 위해 를 찾는 가장 좋은 방법은 무엇입니까? 이것은 나의 첫 번째 샷이었습니다. 그러나 아마도 내가 간과하고있는 것이있을 것입니다. 배열 크기는 200 개 요소보다 크지 않습니다.

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}

답변:


210

이미 내장 된 Contains () 메서드를 사용하십시오.

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

어떤 이유로 내가 처음 방법을 찾았을 때 찾을 수 없었습니다 ... 감사합니다.
Brad

4
@Brad : Enumerable에서 오는 확장 메서드이기 때문입니다.
AnthonyWJones

8
한 줄로 :(new string[] { "foo", "bar" }).Contains("foo")
Denis V

8
더 짧게 :new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot

25

나는 이것이 오래되었다는 것을 알고 있지만, 나는 새로운 독자들이 제네릭과 확장 방법을 사용하여 이것을 수행하는 새로운 방법이 있다는 것을 알고 싶었다.

이 작업을 수행하는 방법에 대한 자세한 정보를 보려면 내 블로그 게시물 을 읽을 수 있지만 주요 아이디어는 다음과 같습니다.

이 확장 메서드를 코드에 추가하면 :

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

다음과 같이 검색을 수행 할 수 있습니다.

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

모든 유형에서 작동합니다 (좋은 equals 메소드를 작성하는 한). 확실히 모든 값 유형.


내가 var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");원하는 것은 첫 번째 열의 who datatable을 통해 값이 다음 문자열로 끝나지 않는지 확인하는 것입니다. 값이 다음 문자열로 끝나지 않으면 다음과 같은 문자열을 반환하고 싶습니다. 이 값을 실종 .00나는이 일이 어떤 제안을 작동하지 않습니다 아직 내가 문자열을 반환하기 위해 방법을 변경 부울을 반환하지 않기 때문에 조금 복잡합니다 그러나 작동시킬 수없는 것 귀하의 예제를 사용하여, 예를 들면
MethodMan

이것은 사이트에 대한 질문으로 더 잘 제시된 것 같습니다. 필요한 경우이 답변을 참조하십시오.
Gabriel McAdams 2015

실제로 원하는 작업을 수행하는 멋진 방법을 생각해 낼 수있었습니다. Datatables ItemArray에 대한 for 루프 내부의 문자열 값이 다음 값 중 하나로 끝나는 지 확인하는 무언가를 작성했습니다. string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan 2015

12

단순히 Array.Exists 함수 (또는 약간 더 편리한 .NET 3.5를 사용하는 경우 Contains 확장 메서드) 뒤에 있습니다.


3
다음은 .NET 2.0의 작동 예제입니다. if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
Fueled

7

Linq (S & G 용) :

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

또는 요구 사항에 따라

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));


2

일반적으로 배열은 특정 개체가 컬렉션에 있는지 여부를 묻고 자 할 때 사용하기에 좋지 않은 데이터 구조입니다.

이 검색을 자주 실행 Dictionary<string, something>하는 경우 배열보다는 을 사용하는 것이 좋습니다. 사전 검색은 O (1) (일정 시간)이고 배열 검색은 O (N)입니다 (배열 길이에 비례하는 시간 소요).

배열이 최대 200 개 항목 일지라도 이러한 검색을 많이 수행하면 사전이 더 빨라질 수 있습니다.


1
이진 검색은 O (log n); 사전 대한다 에 O (1) - 그러나 많은 오버 헤드가있다; 중소 규모의 경우 선형 검색 또는 이진 검색이 성능을 능가 할 수 있습니다.
Marc Gravell

1

LINQ를 사용하여 배열을 반복 할 수도 있습니다. 또는 대리자를 검색하는 Find 메서드를 사용할 수 있습니다. 그러나 나는 find 메소드가 그냥 반복하는 것보다 조금 더 비싸다고 생각합니다.


Find 메서드는 "루핑-스루"메서드와 알고리즘 적으로 동일합니다. 추가 비용은 객체 생성과 간접적 인 레이어가 될 수 있지만 가독성을 희생하여 최적화하는 것에 대해 걱정한다면 잘못된 것에 대해 걱정하고 있습니다.
AwesomeTown

1

위의 스레드에서 여러 번 언급했듯이 사용중인 프레임 워크에 따라 다릅니다. .Net Framework 3 이상에는 배열에 대한 .Contains () 또는 Exists () 메서드가 있습니다. 아래의 다른 프레임 워크의 경우 배열을 반복하는 대신 다음 트릭을 수행 할 수 있습니다.

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

효율성에 대해 잘 모르겠습니다 ... Dave


0

이는 수동으로 어레이를 반복하는 것보다 빠릅니다.

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

LINQ를 사용하는 것이 예제에서 수행 된 것처럼 문자열을 반복하는 것보다 빠릅니다. strArray.Contains (key) 만 있으면됩니다
Chris Ballance

3
이면에서 strArray.Contains (key)는 어쨌든 배열을 반복 할 것입니다 ... O (n) 검색을 수행하는 데 필요한 마법은 없습니다.
AwesomeTown

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.