문제

내부 IList<>를 노출하는 클래스 속성이 있습니다.

System.Collections.ObjectModel.ReadOnlyCollection<>

이 부분을 어떻게 전달할 수 있습니까? ReadOnlyCollection<> 요소를 새 배열에 복사하지 않고(라이브 뷰가 필요하고 대상 장치의 메모리가 부족함)?저는 Compact Framework 2.0을 목표로 하고 있습니다.

도움이 되었습니까?

해결책

Yield를 사용하여 열거형을 반환하는 메서드를 사용해 보세요.

IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}

다른 팁

이러한 foreach 샘플은 괜찮지만 .NET 3.5 및 LINQ를 사용하는 경우 훨씬 더 간결하게 만들 수 있습니다.

return FullList.Where(i => IsItemInPartialList(i)).ToList();

IList를 구현하고 인덱스를 변환한 후 모든 호출을 원본 목록으로 전달하는 클래스를 언제든지 작성할 수 있습니다(따라서 자체 데이터 복사본이 없음).

Yield return을 사용하여 필터링된 목록을 만들 수 있습니다.

IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}

컬렉션을 필터링해야 하는 방법에 따라 IList(또는 적합한 경우 IEnumerable)를 구현하지만 원하는 값만 반환하기 위한 인덱싱 및 액세스에 문제가 있는 클래스를 생성할 수 있습니다.예를 들어

class EvenList: IList
{
    private IList innerList;
    public EvenList(IList innerList)
    {
         this.innerList = innerList;
    }

    public object this[int index]
    {
        get { return innerList[2*i]; }
        set { innerList[2*i] = value; }
    }
    // and similarly for the other IList methods
}

필터링된 요소에 어떻게 액세스해야 합니까?Iterator를 통해서라면 공개적으로 표시하고 싶지 않은 요소를 건너뛰는 사용자 정의 반복자를 작성할 수 있을까요?

컬렉션을 제공해야 하는 경우 기본 컬렉션을 프록시할 뿐 공개적으로 표시하지 않으려는 요소에 대한 액세스를 차단하는 고유한 컬렉션 클래스를 작성해야 할 수도 있습니다.

(부인 성명:저는 C#에 익숙하지 않으므로 일반적인 답변입니다.더 잘 작동하는 C#에 대한 더 구체적인 답변이 있을 수 있습니다.)

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