2016-06-16 2 views
1

최근에 저는 LazyList 개념을 알고 있었기 때문에이 개념을 내 작업에 구현하고 싶습니다.C# 많은 항목에 대한 지연 목록

데이터베이스에서 수십만 개의 항목을 검색 할 수있는 서버 방식이 있으므로 List<T> 대신 LazyList<T>을 반환하고 싶습니다.

내가 이해할 수있는만큼 동일하지 않은 Lazy<List<T>>을 찾을 수있었습니다. Lazy<List<T>>은 내가 필요로하는 것이 아닌, 게으른 목록의 초기화를 만듭니다.

누군가를 사용해 본 적이 있다면 Scheme 언어에서 예제를 제공하고 싶습니다.

기본적으로 주어진 노드의 값을 계산해야하고 실제로는 값을 검색하기 위해 계산해야 할 함수 인 LinkedNodes으로 구현됩니다.

실제로 400k 정도의 크기로 목록을 제어하는 ​​방법을 궁금해합니다. 목록을 보유하는 데 비용이 많이 드는 것처럼 들리 겠지만, 몇 MB의 크기로 목록을 만들 수 있습니다. GB로 가져올 수있는 것은 DB 작업 해야합니다.

임 현재 닷넷 4.5 사용하여 C# 버전 4

+0

@ Claies 나는 그것에 대해 생각했지만 db에서 데이터를 검색 할 때 이미 객체의 인스턴스가 있습니다. 어떻게 reinstanstation을 다시 처리합니까? –

+0

인스턴스 유형은 무엇입니까? 어쩌면 이미 IEnumerable을 구현하는 많은 유형이 가지고있는 것과 같이 지연된 평가가있을 수 있습니다. – cassandrad

답변

4

대신 List<T> 또는 LazyList를 반환, 왜 결과를 반환 양보하지? 이것은 모든 행을 검색하는 것보다 훨씬 낫습니다. 행별로 스트림을 스트리밍합니다. 메모리 관리가 더 좋습니다. 예를 들어

: (가짜)

private IEnumerator<Row> GetRows(SqlConnection connection) 
{ 
    var resultSet = connection.ExecuteQuery(.....); 
    resultSet.Open(); 
    try 
    { 
     while(resultSet.FetchNext()) 
     { 
      // read one row.. 
      yield return row; 
     } 
    } 
    finally 
    { 
     resultSet.Close(); 
    } 
} 

foreach(var row in GetRows(connection)) 
{ 
    // handle the row. 

} 

각 결과 집합은 각 행이 처리 방법.

+0

수확량이 나를 위해 이것을 어떻게 해결하는지 설명하는 것이 중요합니까? –

+0

실수로 mongodb 드라이버 AsyncCursor와 함께 작동하는 방법을 알고 있습니까? –

+0

yield는 1에서 모든 행을 읽지 못하게합니다. foreach가 IEnumerator 을 반복 할 때마다 결과 집합에서 다음 행을 가져옵니다. 자세한 내용은 다음을 참조하십시오. https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx –

관련 문제