2012-07-05 2 views
3

가 나는 종종 자신이 다음과 같은 조건문을 작성 찾을 :SQL의 IN 비교와 비슷한 C# 구문 설탕?

if(Path.GetExtension(filename) == ".pdf" || Path.GetExtension(filename)== ".doc") 
{ 
    // do something 
} 

호출 Path.GetExtension를() 내가 테스트 할 각 파일 확장자에 한 번하는 것은 약간 중복 보인다.

string fileExtension = Path.GetExtension(filename); 
if(fileExtension == ".pdf" || fileExtension == ".doc") 
{ 
    // do something 
} 

을하지만 난 단지, 비교 및 ​​아무것도에 대한 fileExtension를 사용하여 매우 우아하지 않는 것 파일 확장자에 대한 변수를 선언하고있어 고려 : 부여, 나는 이런 식으로 뭔가를 할 수 있습니다.

SELECT file FROM table WHERE fileExtension IN(".pdf", ".doc") 

나 더 반복하지 않고 테스트를 수행 할 수 있습니다

는 SQL, 난 IN 연산자를 사용할 수 있습니다.

C#은 SQL과 비슷한 구문 당을 제공합니까? 비교할 변수 나 평등 연산자를 반복하지 않아도됩니까?

답변

8

그냥 새로운 배열 인라인을 만들고 Contains 전화 : 확실히 그것을

if((new[]{ ".pdf", ".doc"}).Contains(fileExtension)) 
{ 
    // Do Something 
} 
+0

나는 이와 같은 것을 기대하고있었습니다. 나는 단지 비교를 위해서 새로운 배열을 인스턴스화해야한다는 것은 다소 불행한 일이라고 생각하지만 이것은 의도를 잘 전달합니다. – Andrew

1

저스틴의 대답을 할 것이다. 하지만 내게 잔인한 것처럼 보입니다. 확실히, 컬렉션에서 비교 대상인 확장을 이미 갖고 있지 않다면 두 번째 예제에서와 같이 단순히 직접 비교하는 것보다 훨씬 효율적이지 않은 것 같습니다. (첫 번째 예제는 IMO에 나쁜 접근입니다.)

두 번째 예제에서와 같이 결과를 변수에 저장하는 것이 매우 효율적일 수 있습니다. 변수가 다음에 나오는 비교에서만 사용되면 컴파일러가 할 수있는 모든 종류의 최적화가 있습니다. 변수를 작성하지 않아도됩니다. 당신이 가독성을 걱정하는 경우

+1

이 코드 조각은 성능에 결정적인 요소는 아니므로 선택할 때 코드 가독성이 가장 중요합니다. IMO는 두 개 또는 세 개의 확장이있을 때 배열이 분명 더 좋습니다. – CodesInChaos

+0

주어진 예제에는 두 개 또는 세 개의 확장자가 없습니다. 만약 내가 이것을 쓰고 있고 부부 이상이 있었다면, 나는 컬렉션도 사용할 것이다. 하지만 미리 정적 멤버로 정의하고 비교할 때마다 만들지는 않겠습니다. compare 문을 비교하고 부분적으로 만들 때마다 컬렉션을 다시 만들면 읽기 쉽거나 성능이 떨어지는 것처럼 보입니다. –

3

당신은 당신이 다르게 다른 확장명을 처리해야이 경우에도 미래의 증거입니다

switch (fileExtension) 
{ 
    case ".pdf": 
    case ".doc": 
     // do something     
     break; 
} 

갈 수 있습니다.

0

SQL 연산자처럼 실제로 읽고 싶다면 확장 메서드를 사용할 수 있습니다.

public static bool In(this object o, IEnumerable c) 
{ 
    foreach (object i in c) 
    { 
     if (i.Equals(o)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

사용법 :

string fileExtension = ".pdf"; 
string[] acceptedFileExtensions = new[] { ".pdf", ".doc" }; 

if (fileExtension.In(acceptedFileExtensions)) 
{ 
    // Do something 
} 
1

난 당신이 이미 솔루션을 수락 한 것을 볼 수 있지만, 내가 더 밀접하게 많은 사용자의 의도를 다음과 생각하는 내 제출하고 싶습니다.

public static bool In(this object source, params object[] collection) 
{ 
    return collection.Contains(source); 
} 

사용법 : 도움이

if(Path.GetExtension(filename).In(".pdf", ".doc")) 
{ 
    //Do something 
} 

희망.

편집 : "GetExtension"기능이 정확하게 반영되도록 파일 확장명에 마침표가 추가되었습니다.

+0

감사합니다. 이것은 시원하고 간결합니다. Path.GetExtension (문자열)에는 '.'이 포함되어 있으므로 Path.GetExtension (파일 이름) .In (".pdf", ".doc")이어야합니다. 편집을 시도했으나 편집을 위해 최소 6 자의 문자가 필요하기 때문에 저장하지 못했습니다. – Andrew

+0

아, 알겠습니다. 아래쪽에 6 자 제한을 초과하는 편집 내용을 설명하는 "메모 편집"을 추가 할 수 있습니다. 나는 그것을 반영하기 위해 나의 대답을 편집 할 것이다. – Thebigcheeze