list <t>에 다른 목록이 있는지 확인하십시오.


100

다음과 같은 매개 변수 목록이 있습니다.

public class parameter
{
    public string name {get; set;}
    public string paramtype {get; set;}
    public string source {get; set;}
}

IEnumerable<Parameter> parameters;

그리고 내가 확인하고 싶은 문자열 배열.

string[] myStrings = new string[] { "one", "two"};

매개 변수 목록을 반복하고 소스 속성이 myStrings 배열과 같은지 확인하고 싶습니다. 중첩 된 foreach로이를 수행 할 수 있지만 linq를 가지고 놀았고 중첩 된 foreach가 잘못된 느낌을주는 enumerable의 확장 메서드처럼 더 좋은 방법으로 수행하는 방법을 배우고 싶습니다. 더 우아한 선호하는 linq / lambda / delegete 방법이 있습니까?

감사

답변:


212

다음에서 사용할 수있는 Any()이 검사에 중첩 을 사용할 수 있습니다 Enumerable.

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));

빠른 큰 컬렉션에서 수행하는 프로젝트에 것 parameterssource다음 사용 Intersect내부적으로 사용하는 HashSet<T>당신은 O (N)의 체크를 할 수있는 첫 번째 방법 (두 개의 중첩 루프에 해당)에 대한 (N ^ 2) 그래서 대신 O를 :

bool hasMatch = parameters.Select(x => x.source)
                          .Intersect(myStrings)
                          .Any(); 

또한 부수적으로 C # 스타일 지침에 따라 클래스 이름과 속성 이름을 대문자로 사용해야합니다.


고마워요 내가 찾고있는 것 같습니다. 좀 더 기능적인 측면을 가지고 놀아야합니다. 클래스와 속성을 대문자로 사용하는 것과 관련하여 위의 예제를 작성할 때 잊어 버렸습니다.
gdp

1
왜 O (n ^ 2)입니까? 우리가 이야기하고있는 것은 O (n * m)가 아닌 두 개의 변수를 피하는 것이 아닌가? m (모수)은 상수이므로 O (n)과 동일합니다. 여기서 교차가 얼마나 빨라야할지 모르겠어요? 그러나 동의했습니다. Intersect는 더 빠를 가능성이 있지만 보장되지는 않습니다.
Squazz

당신은 그것이 O (n * m)이어야한다는 것이 옳습니다 – m은 상수가 아닙니다 – 비록 주어진 특정한 예에서 그것이 "2"일지라도 그것은리스트 중 하나의 크기입니다. 비록 상수 값이 실제로 무시할 수는 없지만-사소하지 않은 모든 목록 길이에 대해 Intersect더 빠를 것입니다. 목록이 사소하게 짧으면 어떤 식 으로든 중요하지 않습니다 (이 경우 성능은 아마도 당신의 관심사가 아닐 것입니다 )
BrokenGlass

조건이 참이되는 목록 인덱스를 어떻게 알 수 있습니까? 문장이있는 목록이 있습니다. 특정 단어가있는 배열이 있습니다. 문장에 배열의 단어가 하나 이상 있으면 목록의 색인이 필요합니다. @BrokenGlass
kirushan

1
성능면에서 parameters.Any(x => myStrings.Contains(x.source));첫 번째 예보다 낫지 않습니까?
Fluppe

5

다음은 다른 목록에 일치 요소가 있는지 확인하는 샘플입니다.

List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 };
List<int> nums2 = new List<int> { 1, 3, 6, 9, 12};

if (nums1.Any(x => nums2.Any(y => y == x)))
{
    Console.WriteLine("There are equal elements");
}
else
{
    Console.WriteLine("No Match Found!");
}

2
관련된 목록이 크면 목록 크기 Intersect가 O (N * M)이므로 접근 방식 보다 훨씬 느려집니다 . (그래도 메모리에는 O (1)입니다.)
Jon Skeet

1

두 목록이 너무 크고 람다 표현을 사용하면 가져 오는 데 오랜 시간이 걸립니다. 이 경우 linq를 사용하여 매개 변수 목록을 가져 오는 것이 좋습니다.

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.