문제

제가 작업하고 있는 프로젝트에는 정말 거대한 컬렉션(1M-1B 요소)이 있고, 대부분 컬렉션으로 수정됩니다.

실시간 앱이므로 성능이 가장 중요합니다.

Reverse, BinarySearch(가능합니까?) 등과 같은 일부 작업의 경우 Select 등과 같은 다른 작업보다 더 많은 어려움을 겪습니다.

가능한 MoveNext, MovePrev 등을 사용하여 자체 IEnumerable을 구현하고 이러한 기능을 활용하는 자체 구현된 LINQ 확장을 구현하는 것이 가능합니까?

이런 일이 일어날 경우 프로젝트가 끝날 때 일어날 것입니다.먼저 작동하게 한 다음 더 빠르게 만들어야 하기 때문입니다.

전체적으로 이 작업은 너무 많은 작업이 되어서는 안 됩니다. 그렇죠?

도움이 되었습니까?

해결책

자신의 구현을 만드는 것이 매우 가능합니다. Enumerable 어떤 상황을 특별하게 만들 수 있습니다. 기본적으로 자신의 컬렉션 유형 (또는 아마도 컬렉션 만 List<T>) 그리고 해당되는 경우보다 효율적인 구현을 사용하십시오.

나는있다 샘플 프로젝트 예제를보고 싶은 "한 시간 안에 객체로 LINQ를 구현하는"데모에 사용했던 것입니다. 완전한 구현이 아니며 특히 더 적은 실제 LINQ보다 객체보다 효율적이지만 여전히 흥미로울 수 있습니다.

또는 당신은 그것을 찾을 수 있습니다 I4O (인덱스 LINQ) 상자 밖에서 필요한 모든 것을 사용하거나 처음부터 시작하는 것보다 그에 기여하는 것이 더 좋습니다. 체크 아웃 할 가치가 있습니다.

하루가 끝나면 LINQ는 기본적으로 구문 설탕과 결합 된 멋진 디자인입니다. C# 컴파일러는 모릅니다 아무것 특별한 System.Linq.Enumerable, 예를 들어.

다른 팁

정말로 성능을 원한다면 꽤 많은 일을 할 수 있습니다.다음 선택 사항을 기억하세요.

var result = from element in collection
             where element.Id == id
             select element;

다음과 같이 컴파일됩니다.

var result = collection.Where(element => element.Id == id);

유형에 대해 다음 메소드를 작성하는 경우 collection, 그러면 기본 작업이 ID 멤버의 동일성이라는 사실을 활용하고 최적화된 방식으로 요청을 처리할 수 있습니다.중요한 것은 컬렉션에서 성능이 중요한 작업을 올바르게 식별하고 올바른 알고리즘을 선택하는 것입니다(예:복잡성)을 수행합니다.

public IEnumerable<TElement> Where(Expression<Func<TElement, bool>> selector)
{
    // detect equality of the Id member and return some special value
}

System.linq.enumerable.reverse ()를 고려하십시오 -이 메소드는 첫 번째 결과를 반환하기 전에 ienumerable을 완전히 열거합니다.

쿼리가 myCollection.reverse (). Take (10)이고 컬렉션에 수십억 개의 항목이 있으면 수십억의 항목을 열거하여 10 개를 얻는 것이 끔찍한 아이디어입니다.

자신의 유형에 리버스 메소드를 제공 한 경우 컬렉션을 통해 뒤로 루프를 반복하는 더 나은 구현을 공급할 수 있습니다 (인덱스별로).

이의 핵심은 구현을 제어 할 수있는 자신의 유형을 제공하는 것입니다. 모든 사람에게 맞는 구현을 사용할 수는 없습니다 IEnumerable<T> 이러한 구현은 사용자 정의 수집 유형의 기능을 최대한 활용하지 않기 때문입니다.

가능한 Movenext, MovePrev 등으로 자신의 ienumerable을 구현하고 이들의 장점을 취하는 구현 된 LINQ 확장자를 자체적으로 구현할 수 있습니까?

IEnumerable (또는 더 적절하게, IEnumerator)가 없습니다 MovePrev. 인터페이스를 정의 할 수 있습니다.

public interface IReversable<T> : IEnumerable<T>
{
    IEnumerator<T> GetReverseEnumerator();
}

이는 효율적인 역 열거를 지원하는 컨테이너에 의해 구현 될 수 있습니다.

그런 다음 과부하를 쓸 수 있습니다 Reverse (확장 방법)이 새로운 인터페이스와 인터페이스를 구현하는 컬렉션 클래스를 작동 시키면 표준 클래스 대신 컬렉션 클래스를 사용해야합니다. List<T>.

그러나 (나는 확인하기에 편리한 반사판이 없음) 내장 된 것일 수 있습니다. Reverse 얻을 수 있다면 빠른 방법으로 일을 할 수있을만큼 똑똑합니다. IList 컬렉션의 인터페이스는 어쨌든 가장 일반적인 경우를 최적화합니다.

따라서 이런 종류의 접근 방식에는 많은 점이 없을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top