2014-10-21 2 views
1

필드에 ICollection<T>이 있습니다. 읽기 전용으로 만들 수있는 간단한 방법이 있습니까?ICollection <T>을 IReadOnlyCollection <T>으로 반환 하시겠습니까?

참고로 ReadOnlyCollection<T> 클래스는 IList<T>이며, 나는 ICollection<T>을 반전하고 사용자가 컬렉션을 변경할 수 없도록합니다.

AsEnumerable ex. 메서드를 사용하면 보장 할 수 없으므로 원래 형식 인 List으로 다시 캐스팅 될 수 있습니다.

+0

원본 컬렉션의 복사본이 만족 스럽다면 (즉, 원래 컬렉션의 향후 변경 사항을 반영하지 않는 개체를 반환하는 경우) - IMHO 컬렉션을 배열에 복사 한 다음 반환하면됩니다. 당신이 정말로 원한다면 ReadOnlyCollection 에 포장해야하지만, 그 시점에서 꼭 필요한 것은 아닙니다.) 반환 된 컬렉션이 원본에 대한 향후 변경 사항을 반영하도록하려면 내 게시 된 답변을 확인하십시오. –

답변

1

저는 항상 다소 이상하다고 생각했습니다. ReadOnlyCollection<T>은 실제로 읽기 전용 목록입니다. .NET 4.5도 약간 새로운 인터페이스 분산을 지원하기 위해 실제 읽기 전용 인터페이스가 있음을

public class TrueReadOnlyCollection<T> : ICollection<T>, IReadOnlyCollection<T> 
{ 
    private ICollection<T> _original; 

    public TrueReadOnlyCollection(ICollection<T> original) 
    { 
     _original = original; 
    } 

    public void Add(T item) 
    { 
     throw new NotSupportedException(); 
    } 

    public void Clear() 
    { 
     throw new NotSupportedException(); 
    } 

    public bool Contains(T item) 
    { 
     return _original.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     _original.CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return _original.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return true; } 
    } 

    public bool Remove(T item) 
    { 
     throw new NotSupportedException(); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (T t in _original) 
     { 
      yield return t; 
     } 
    } 

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

참고 : 말했다

, ICollection<T>는 간단한 인터페이스, 그것은 ReadOnlyCollection<T> 사실을 구현하는 사소한 기능, 그래서 만약 당신이 위의 일을 또한 구현하는 것이 좋을 수도 IReadOnlyCollection<T>

1

ICollection 구현 IEnumerable, 그래서 난 그냥 .ToList().AsReadOnly() 할 수있을 것 같아요. 그러나 Peter Duniho가 언급했듯이 원래 컬렉션의 복사본이 만들어 지므로이 컬렉션에 대한 변경 사항은 복사본에 표시되지 않습니다. 그러나 아마도이 컬렉션은 원하는대로 보일 수도 있습니다.

+0

큰 컬렉션의 주요 문제 일 수있는 모든 복사본을 만듭니다. –