2015-11-18 57 views
2

我对IAsyncCursor如何实现GetEnumerator()和Dispose()?

public sealed class DeferredResultCollection<TResult> : IEnumerable<TResult>, IDisposable 
{ 
    private readonly IAsyncCursor<TResult> _asyncCursor; 

    public DeferredResultCollection(IAsyncCursor<TResult> asyncCursor) 
    { 
     _asyncCursor = asyncCursor; 
    } 

    public IEnumerator<TResult> GetEnumerator() 
    { 
     for (; _asyncCursor.MoveNextAsync().Result;) 
     { 
      foreach (var result in _asyncCursor.Current) 
      { 
       yield return result; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public void Dispose() 
    { 
     if (_asyncCursor != null) 
     { 
      _asyncCursor.Dispose(); 
     } 
    } 
} 

我在C#中新以下包装类,我想补充新的构造IList<TResult>并实施新的方法为IList<TResult>GetEnumerator()Dispose()。这个怎么做?请帮帮我。

回答

1

所以,如果我理解正确,您想要从IAsyncCursor<T>IList<T>中提取值。

这很简单:有两个字段,并使用不是null

public sealed class DeferredResultCollection<TResult> : IEnumerable<TResult>, IDisposable 
{ 
    private readonly IAsyncCursor<TResult> _asyncCursor; 
    private readonly ICollection<TResult> _results; 

    public DeferredResultCollection(IAsyncCursor<TResult> asyncCursor) 
    { 
     if (asyncCursor == null) 
      throw new ArgumentNullException(nameof(asyncCursor)); 

     _asyncCursor = asyncCursor; 
    } 

    public DeferredResultCollection(ICollection<TResult> results) 
    { 
     if (results == null) 
      throw new ArgumentNullException(nameof(results)); 

     _results = results; 
    } 

    public IEnumerator<TResult> GetEnumerator() 
    { 
     return _results != null 
      ? _results.GetEnumerator() 
      : GetAsyncCursorEnumerator(); 
    } 

    private IEnumerator<TResult> GetAsyncCursorEnumerator() 
    { 
     for (; _asyncCursor.MoveNextAsync().Result;) 
     { 
      foreach (var result in _asyncCursor.Current) 
      { 
       yield return result; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public void Dispose() 
    { 
     if (_asyncCursor != null) 
     { 
      _asyncCursor.Dispose(); 
     } 
    } 
} 
1

如果我明白你的问题吧,我就开始添加第二私有字段:

private readonly IAsyncCursor<TResult> _asyncCursor; 
private readonly IList<TResult> _list; 

和构造:

public DeferredResultCollection(IList<TResult> list) 
{ 
    _list = list; 
} 

,只是检查哪一个是在人口您的GetEnumerator

public IEnumerator<TResult> GetEnumerator() 
{ 
    if(_list) != null 
     foreach(var item in _list) 
     { 
      yield return item; 
     } 
    if(_asyncCursor) != null 
     for (; _asyncCursor.MoveNextAsync().Result;) 
     { 
      foreach (var result in _asyncCursor.Current) 
      { 
       yield return result; 
      } 
     } 
    } 

如果有效,那么你可以看重构代码,看看什么(如果有的话)可以组合或移动到单独的方法。

请注意,您不能DisposeIList,因为它不延伸IDisposable因此Dispose方法中没有任何更改。

相关问题