문제

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top