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로 하였는데요. 여기서 x는 IWebElement 타입의 요소를 나타내고, y는 인덱스를 나타냅니다. 따라서 인덱스 기반의 조건 필터링을 쉽게 할 수 있습니다.
코드 동작 방식
FindElements로XPath를 사용해 특정 엘리먼트들을 찾아요.Where메서드는 해당 엘리먼트와 인덱스를 동시에 사용해 필터링 할 거예요. 여기서 인덱스는y에 해당하고, 인덱스가ind이하일 때만 조건을 만족하는 엘리먼트를 필터링합니다.
값이 누적 되는 형태라 인덱스를 증가시켜 특정 위치에 있는 값만 추출하고 싶었어요.- 필터링된 엘리먼트를
foreach문으로 순회하며, 텍스트를 가져오거나 다른 작업을 수행할 수 있어요.
Func<TSource, int, bool> 사용: 이 서술자를 이용하면 단순히 값뿐만 아니라 해당 값의 인덱스까지 조건에 포함할 수 있습니다.
추가 예시
만약 인덱스가 짝수인 요소만 선택하고 싶다면, 조건을 이렇게 변경할 수 있을 것입니다.
var rv = m_DriverBs.FindElements(By.XPath(reviewXPath)).Where((x, y) => y % 2 == 0);
이 방식으로 LINQ의 Where 메서드를 통해 인덱스를 활용한 필터링을 매우 유연하게 사용할 수 있어요~ 반복문으로 해결해야 하나, 하며 고민 하다가 이러한 오버로드가 있다는 걸 찾았답니다.
