[C#] Where에서 인덱스 가져오는 방법. Func[TSource, int, bool] predicate (LINQ)

C#의 LINQ에서 인덱스를 사용하여 조건을 필터링하는 방법은요~ Where 메서드를 사용할 때, 서술자 Func<TSource, int, bool>를 사용하여 해결할 수 있어요. 이 서술자는 TSource 타입의 값과 해당 값의 인덱스를 받아들여 조건을 평가한답니다. 😊

Func<TSource, int, bool> predicate 예시

예시는 '크롬 드라이버' 클래스에서 FindElements를 사용해 IEnumerable<IWebElement> 타입의 엘리먼트들을 가져온 다음, Where 메서드를 이용해 인덱스에 따라 필터링을 진행하는 것으로 보여드리겠습니다. 예시이며 그대로 사용하면 인스턴스 할당이 없기에 작동하지 않으니 수정하셔야 해요.

ChromeDriver m_DriverBs = null;
string reviewXPath = "";
int ind = 0;

// FindElements로 엘리먼트 리스트를 가져온 후, Where를 이용해 인덱스 조건에 맞는 요소 필터링
var rv = m_DriverBs.FindElements(By.XPath(reviewXPath)).Where((x, y) => ind <= y);

foreach (IWebElement elm in rv)
{
    ind++;
    string test = elm.Text;
}

위 코드에서 Where 메서드의 서술자를 (x, y) => ind <= y로 하였는데요. 여기서 xIWebElement 타입의 요소를 나타내고, y는 인덱스를 나타냅니다. 따라서 인덱스 기반의 조건 필터링을 쉽게 할 수 있습니다.

코드 동작 방식

  1. FindElementsXPath를 사용해 특정 엘리먼트들을 찾아요.
  2. Where 메서드는 해당 엘리먼트와 인덱스를 동시에 사용해 필터링 할 거예요. 여기서 인덱스는 y에 해당하고, 인덱스가 ind 이하일 때만 조건을 만족하는 엘리먼트를 필터링합니다.
    값이 누적 되는 형태라 인덱스를 증가시켜 특정 위치에 있는 값만 추출하고 싶었어요.
  3. 필터링된 엘리먼트를 foreach문으로 순회하며, 텍스트를 가져오거나 다른 작업을 수행할 수 있어요.

Func<TSource, int, bool> 사용: 이 서술자를 이용하면 단순히 값뿐만 아니라 해당 값의 인덱스까지 조건에 포함할 수 있습니다.

추가 예시

만약 인덱스가 짝수인 요소만 선택하고 싶다면, 조건을 이렇게 변경할 수 있을 것입니다.

var rv = m_DriverBs.FindElements(By.XPath(reviewXPath)).Where((x, y) => y % 2 == 0);

이 방식으로 LINQ의 Where 메서드를 통해 인덱스를 활용한 필터링을 매우 유연하게 사용할 수 있어요~ 반복문으로 해결해야 하나, 하며 고민 하다가 이러한 오버로드가 있다는 걸 찾았답니다.

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗