다음과 같은 매개 변수 목록이 있습니다.
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));
빠른 큰 컬렉션에서 수행하는 프로젝트에 것 parameters
에 source
다음 사용 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();