2014-08-27 1 views
2

전달한 모든 데이터를 검색하고 저장하는 간단한 캐시 클래스가 있습니다. 이 클래스에있는 유일한 작업은 "Get (문자열 키)"및 "Store (문자열 키, 개체 데이터)"입니다. 나는이 클래스를 사용하여 값 비싼 객체를 저장하고 빠르게 검색한다.지연 초기화를 위해 IEnumerable과 List를 캐시하십시오.

상상해보십시오. 배열을 저장하고 싶습니다. 내가 아는 한, IEnumerable 구현은 본질적으로 게으른 인스턴스화입니다. 내 질문은 : 캐시 클래스 (즉, LINQ 쿼리의 결과 집합)에 IEnumerable 변수를 저장하면이 클래스는 처리 된 모든 요소와 함께 저장되거나 저장된 IEnumerable을 검색 할 때마다 모든 처리 과정을 거쳐야합니다. 그 IEnumerable 생성을 암시? "ToList()"를 사용하여 초기화를 트리거해야합니까?

Notes :이 캐시 클래스의 소스에 액세스 할 수 없으며 개체를 저장하고 검색한다는 것을 알고 있습니다.

+0

그 문자열, 객체의 사전 다르다 할 수 있어야합니다. – Paparazzi

답변

3

IEnumerable은 인터페이스가 아닌 클래스입니다. 인터페이스 뒤의 구현은 동작을 정의합니다.

IEnemerable <에서 ToList()를 호출하면 목록 <>을 가져오고 List는 해당 인터페이스를 구현하므로 IEnumerable <>을 호출합니다.

포인터를 IEnumerable <>으로 저장하고 그 위에 반복하는 것은 목록을 반복하는 것과 같습니다.

IEnumerable <>가 반복기의 결과 일 경우 IEnumerable <>에 액세스 할 때마다 구현을 실행합니다.

예 : 다음 함수를 취 그것을 사용

public IEnumerable<int> Generator(int max) 
{ 
    for (var i = 0; i < max; i++) 
    { 
     yield return someExpensiveFunction(); 
    } 
} 

var cache = Generator(100); 

for (var i = 0; i < 2; i++) 
{ 
    foreach (var i in cache) 
    { 
     //ops 
    } 
} 

으로이 발전기 평가한다 (== IEnumerable을 <을>) 회.

var cache = Generator(100).ToList(); 

for(var i = 0; i < 2; i++ 
{ 
    foreach(var i in cache) 
    { 
     //ops 
    } 
} 

이 한 번만 생성기 (==는 IEnumerable <을>) 평가합니다.

I.E. IEnumerable < 캐싱은 ToArray(), ToList() 등을 호출하여 '구체적'으로 만들면 비용이 많이 들지 않습니다.

돔 추가 안내. 열거 형을 목록으로 변환하고 저장하는 경우 저장 변수를 목록으로 선언하는 것이 좋습니다. 이 문서는 사용자 및/또는 동료에게 저장 모델입니다. public 클래스의 기능 또는 특성의 결과/인터페이스는 간단한 캐시 미상 무엇 컬렉션

class X 
{ 
    private List<int> _cache; 

    public void UpdateCache(IEnumerable<int> items) 
    { 
    _cache = items.ToList(); 
    } 

    public ICollection<T> Cache 
    { 
     get{ return _cache; } 
    } 

    //even better 
    public ReadOnlyCollection<T> Items 
    { 
     get { return new ReadonlyCollection(_cache); } 
    } 
} 
+0

설명을 위해, 즉 Generator를 .List()없이 호출하면 Generator 함수에서 루프를 두 번 호출한다는 의미입니까? 예를 들어 Generator 함수의 총 반복 수는 200 회입니까? "for (var i = 0; i <4; i ++)"의 외부 루프를 만든 경우 총 400 회 반복됩니까? 나는 실수가 없다면 불필요한 작업을 수행하지 않으므로 yield가 지연된 실행을 반환한다고 생각하고 모든 것이 저장되고 변수로 처리됩니다. –

관련 문제