문자열이 문자열 리스트 중 하나라도 포함하는지 알아내기 C# Linq

기존 방식


  기존엔 문자열 A가 문자열 리스트 B의 요소 중 하나라도 포함하는지 알아내려면 다음과 같이 해야 했습니다.
public static void Main(string[] args)
{
    string A = "aabacdd";

    List B = new List();
    B.AddRange(new string[] { "a", "b", "c", "d", "aa", "ba", "cc", "dd" });

    bool contain = false;

    foreach (string e in B)
    {
        if (A.IndexOf(e) != -1)
        {
            contain = true;
            break;
        }
    }
}


  겨우 저런 간단한 로직 하나 실행하는데 이렇게 긴 코드가 필요했죠. 하지만 Linq를 사용하면 단 한 줄로 문자열이 다른 문자열 리스트 중 하나라도 포함하는지 검사가 가능합니다.
public static void Main(string[] args)
{
    var A = "aabacdd";

    var B = new List();
    B.AddRange(new string[] { "a", "b", "c", "d", "aa", "ba", "cc", "dd" });

    bool contain = B.Any(A.Contains);


  bool contain = B.Any(A.Contains); 한 줄. 정말 간단하죠?

  간략하게 설명을 드리자면 IEnumerable.Any(Func predicate) 메소드는 시퀀스에 조건에 맞는 요소가 있는지 확인해줍니다. 이 경우엔 T가 string이므로 predicate는 Func이 될 것이고, string.Contains는 인자로 string을 받으므로 Func의 조건에 맞습니다.

  따라서 B.Any(A.Contains); 는 B 시퀀스의 모든 요소에 대해 A.Contains(B의 각 요소)호출을 반복합니다. 풀어 쓰면 이런 형식으로 되겠죠.

  // B.Any(A.Contains)를 하나하나 호출한다면
  bool result =
    A.Contains(B[0]) ||
    A.Contains(B[1]) ||
    A.Contains(B[3]) ||
    //...
    A.Contains(B[B.Count - 1]);

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭