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

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

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 방법이 있습니까?

감사



답변

다음에서 사용할 수있는 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 # 스타일 지침에 따라 클래스 이름과 속성 이름을 대문자로 사용해야합니다.


답변

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

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!");
}


답변

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

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();


답변