program story

Linq [duplicate]를 사용하여 시퀀스에 다른 시퀀스의 모든 요소가 포함되어 있는지 확인

inputbox 2020. 8. 16. 20:14
반응형

Linq [duplicate]를 사용하여 시퀀스에 다른 시퀀스의 모든 요소가 포함되어 있는지 확인


이 질문에 이미 답변이 있습니다.

두 세트의 값이 주어집니다.

var subset = new[] { 2, 4, 6, 8 };

var superset = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

superset모든 요소가 포함되어 있는지 어떻게 확인 subset합니까?

나는 이것을 생각 해냈다 :

superset.Intersect(subset).Count() == subset.Count()

이것이 가장 논리적이고 효율적인 방법입니까?


카운트? Not Any는 어떻습니까?

bool contained = !subset.Except(superset).Any();

그래서 내 다른 대답은 사용하기가 매우 쉽습니다. 그러나 그것은 O (n * m) 솔루션입니다.

다음은 약간 덜 친숙한 O (n + m) 솔루션입니다. 수퍼 세트가 HUGE 인 경우 사용해야합니다. 반복적으로 수퍼 세트를 열거하지 않습니다.

HashSet<int> hashSet = new HashSet<int>(superset);
bool contained = subset.All(i => hashSet.Contains(i));

기존 Contains () 메서드를 사용하는 확장 메서드가 있습니다. Instersect () 또는 Except ()를 사용하는 것보다 더 직관적입니다.

public static bool ContainsAll<T>(this IEnumerable<T> source, IEnumerable<T> values)
{
    return values.All(value => source.Contains(value));
}

Except를 사용할 수 있으며 결과 개수는 0이어야합니다.

매개 변수에 대한 자세한 내용은 MSDN을 참조하십시오.

예:

subset.Except(superset).Count() == 0

참고 URL : https://stackoverflow.com/questions/407729/determine-if-a-sequence-contains-all-elements-of-another-sequence-using-linq

반응형