다음과 같은 문자열 목록이 있다고 가정합니다.
"A", "B", "C", "D", "E", "F"
이제이 목록 에서 연속 된 두 항목 의 하위 목록 을 검색하고 싶습니다 D E
. Linq를 사용하여 어떻게 할 수 있습니까?
내 접근 방식은 다음과 같습니다.
int i = list.FindIndex(x => x == "D");
int j = list.FindIndex(x => x == "E");
int p = i < 0 || j < 0 ? -1 : (j == i + 1 ? i : -1);
올바른 해결책입니까? 더 짧은 해결책이 있습니까?
다음과 같이 접근 방식을 다시 작성할 수 있습니다.
bool hasSublist = list
.SkipWhile(x => x != "D")
.Take(2)
.SequenceEquals(new[] {"D", "E"});
시작 색인이 필요한 경우 {"D", "E"}
문자와 색인을 쌍으로하는 선택 항목을 추가 할 수 있습니다.
그러나 접근 방식의 문제 는 예를 들어 "D"
뒤에 오지 않는 다른 시퀀스가 있으면 하위 시퀀스를 놓칠 수 있다는 것입니다."E"
"D" "A" "D" "B" "D" "C" "D" "D" "D" "E"
거기에있다 "D" "E"
끝에,하지만 방법은 먼저 찾은 후 정지합니다 "D"
.
길이가 2 인 하위 목록을 찾고 있다면 다음 Zip
과 같이 사용할 수 있습니다 .
bool hasSublist = list
.Zip(list.Skip(1), (a, b) => new {a, b})
.Any(p => p.a == "D" && p.b == "E");
그러나 이것은 더 긴 하위 목록에 대해서는 확장되지 않습니다.
일반 for
루프를 사용하면 훨씬 더 잘 작동합니다.
for (var i = 0 ; i < list.Count-1 ; i++) {
if (list[i] == "D" && list[i+1] == "E") {
...
}
}
if
내부를 대체 할 수 SequenceEquals
있는 길이의 하위 목록을 수용 :
var desiredSublist = new[] {"D", "E", "F"};
for (var i = 0 ; i < list.Count-desiredSublist+1 ; i++) {
if (list.Skip(i).SequenceEquals(desiredSublist)) {
...
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다