2009-02-01 4 views
84

string[]에 요소가 포함되어 있는지 확인하는 가장 좋은 방법은 무엇입니까? 이것은 그것에서의 나의 첫번째 발사이었다. 그러나 아마도 내가 바라 보는 뭔가가있을 것입니다. 배열 크기는 200 개 이하 여야합니다. 또한 배열을 반복 LINQ를 사용할 수 있습니다문자열이 배열입니까?

using System.Linq; 

//... 

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

답변

169

그냥 이미 내장() 메소드를 포함합니다 사용합니다. 또는 대리자를 사용하여 검색하는 Find 메서드를 사용할 수 있습니다. 그러나 나는 find 메소드가 조금 더 비싸다가 그냥 반복한다고 생각한다.

+0

내가 처음 방법을 찾았을 때 나는 그것을 찾을 수 없었다 ... 감사합니다. – Brad

+4

@ 브래드 : Enumerable에서 나온 확장 메서드 때문입니다. – AnthonyWJones

+47

이 작업을 수행하려면 System.Linq를 포함해야합니다. –

1

:

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

Find 메소드는 "루핑 스루"메소드와 알고리즘 적으로 동일합니다. 추가 비용은 어떤 객체 생성과 간접적 인 계층 일 것입니다. 그러나 가독성을 희생시키면서이를 최적화하는 것에 대해 걱정한다면, 잘못된 것에 대해 걱정할 것입니다. –

6

배열이 정렬되어 있습니까? 그렇다면 binary search을 할 수 있습니다. 여기가 the .NET implementation as well.입니다. 배열이 정렬 된 경우 이진 검색은 반복적 인 솔루션보다 성능이 향상됩니다.

+0

Well, O (N) to O (log n) ;-p –

+0

내 쌍곡선을 "지수 적으로"제거했습니다. –

12

간단히 말해 Array.Exists 함수 (또는 .NET 3.5를 사용하는 경우에는 확장 확장 프로그램이 포함되어 있습니다.이 방법이 약간 더 편리합니다)입니다.

+3

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

6

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)); 
1

이 수동 어레이를 통해 반복보다 빠르다에 따라 :

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

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

그리고 그게 더 빠릅니까? – senfo

+0

LINQ를 사용하면 예제에서 수행 된 것처럼 문자열을 반복하는 것보다 빠릅니다. strArray.Contains (key)는 실제로 필요한 모든 것입니다 –

+2

strArray.Contains (key)는 배열을 통해 루프를 반복합니다 ... O (n)을 수행하지 못하게하는 마법은 없습니다. 수색. –

2

배열은 일반적으로 특정 객체가 있는지 묻고 싶으면 사용하기에 불량한 데이터 구조입니다. 컬렉션에 있든 없든

이 검색을 자주 실행하면 어레이가 아닌 Dictionary<string, something>을 사용하는 것이 좋습니다. Dictionary를 통한 검색은 O (N) (배열의 길이에 비례하는 시간이 소요됨) 인 반면 Dictionary에서의 조회는 O (1) (상수 시간)입니다.

배열이 최대 200 개 항목 일지라도 많은 검색을 수행하면 사전이 더 빠를 가능성이 높습니다.

+1

이진 검색은 O (log n)입니다. 사전 **은 O (1)에 종속되어 있지만 오버 헤드가 많이 발생합니다. 중소 규모의 선형 검색이나 이진 검색의 경우 성능이 떨어질 수 있습니다. –

1

위의 스레드에서 여러 번 언급했듯이 사용중인 프레임 워크에 따라 다릅니다. .Net Framework 3 이상에는 배열에 대한 .Contains() 또는 Exists() 메서드가 있습니다. 아래에 다른 프레임 워크를 들면, 나는 이것이 오래 알고 효율에

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

하지 너무 확실 ... 대신 배열을 통해 반복의 ... 데이브

20

을 다음 트릭을 할, 그러나 나는 새를 원 수 독자들은 제네릭과 확장 방법을 사용하여이를 수행하는 새로운 방법이 있음을 알게됩니다.

당신이 읽을 수있는 내 blog post이 작업을 수행하지만, 주요 아이디어는 이것이다하는 방법에 대한 자세한 내용은 다음을 참조하십시오 : 코드에이 확장 방법을 추가

:

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"); 

좋은 평등 방법을 만드는 한 모든 유형에서 작동합니다. 확실한 값 유형.

+0

나는 'var xxx = csvData.Rows [0] .ItemArray [0] .IsIn (". 00", "0.0", ".25", "0.5", ".5", ". 50 ",".75 ");'내가하고 싶은 일은 첫 번째 열의 누가 datatable을 통해 다음 문자열 중 하나에서 값이 끝나지 않는지 살펴 보는 것입니다. 귀하의 예제를 사용하여 예를 들어'.00' 값이 없다는 것을 나타내는 문자열을 반환합니다.이 함수를 작동시키지 못하는 이유는 bool을 반환하고 싶지 않으므로 조금 까다 롭습니다. 문자열을 반환하기 위해 메서드를 변경했습니다. 그러나 아직도 어떤 제안도 작동하지 않는다. – MethodMan

+0

이것은 사이트에서 더 좋은 질문으로 보인다. 필요한 경우이 대답을 참조하십시오. –

+0

사실 내가 할 수있는 일을하는 멋진 방법을 생각해 냈습니다. Datatables ItemArray의 for 루프 내부에있는 문자열의 값이 다음 값 중 하나로 끝나는 지 확인하는 무언가를 썼습니다. 내 문자열 'public static bool EndWithValue (이 문자열 값, IEnumerable 값) { return values.Any (item => value.EndsWith (item)); }' – MethodMan

0

당신은 또한 정적 Array.Exists(...); 기능을 사용할 수 있습니다 Linq는 사용할 수 없습니다 단순히 원하거나하지 않는 경우 : catInside 사실이 될 것이다 일단 술어가 true를 반환 할 때

https://msdn.microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

var arr = new string[]{"bird","foo","cat","dog"}; 

var catInside = Array.Exists( 
    arr, // your Array 
    (s)=>{ return s == "cat"; } // the Predicate 
); 

을 게다가.