IList<>의 일부만 노출하려면 어떻게 해야 합니까?
-
09-06-2019 - |
문제
내부 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#에 대한 더 구체적인 답변이 있을 수 있습니다.)