비 게 니체 아이콜링을 구현하는 클래스와 함께 LINQ를 사용합니다
-
11-09-2019 - |
문제
a에 대해 LINQ 쿼리를 실행하고 싶었습니다 MatchCollection
객체이지만 이것이 구현되지 않기 때문에 불가능하다는 것을 알았습니다. ICollection<T>
, 단지 ICollection
.
코드 간접성뿐만 아니라 성능 및 메모리 사용법 측면에서 비 게 릭 컬렉션과 함께 LINQ를 사용하는 가장 좋은 옵션은 무엇입니까?
(관심이 있으시면 여기에 비 임시 코드가 있습니다 :)
MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
foreach (Match m in fieldValues)
{
if (m.Groups["text"].Value.Equals(someString))
{
// Do stuff
}
}
해결책
당신은 당신을 포함시킬 수 있습니다 someString
LINQ로 필터.
var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
var textMatches = from Match m in matches
where m.Groups["text"].Value.Equals(someString)
select m;
foreach (Match m in textMatches)
{
// Do stuff
}
컴파일러는 이와 같이 쿼리를 번역합니다 ...
var q = from MyType x in myEnum select x;
... 이것으로 ...
var q = from x in myEnum.Cast<MyType>() select x;
... 따라서 유형과 두 가지를 모두 포함합니다 Cast<T>()
중복됩니다.
성능면에서 Cast<T>()
명시 적 유형 캐스트를 수행하고 값을 산출하므로 성능 히트는 무시할 수 있습니다. 모든 회원이 원하는 유형인지 확실하지 않은 레거시 컬렉션의 경우 사용할 수 있습니다. OfType<T>()
대신에.
다른 팁
ienumerable을 반환하는 캐스트 확장 방법을 사용해보십시오.
IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
select m;
캐스트 메소드를 사용하지 않으면 컴파일러가 "쿼리"유형을 ienumerable로 유추합니다.
var query = from Match v in fieldValues
select v;
제휴하지 않습니다 StackOverflow