2009-05-12 3 views
9

У меня есть класс, содержащий коллекцию. Я хочу предоставить метод или свойство, которое возвращает содержимое коллекции. Это нормально, если вызовы классов могут изменять отдельные объекты, но я не хочу, чтобы они добавляли или удаляли объект из фактической коллекции. Я копировал все объекты в новый список, но теперь я думаю, что могу просто вернуть список как IEnumerable <>.Как вернуть копию только для чтения коллекции

В упрощенном примере ниже GetListC лучший способ вернуть только версию для чтения только для чтения?

public class MyClass 
{ 
    private List<string> mylist; 

    public MyClass() 
    { 
     mylist = new List<string>(); 
    } 

    public void Add(string toAdd) 
    { 
     mylist.Add(toAdd); 
    } 

    //Returns the list directly 
    public List<String> GetListA 
    { 
     get 
      { 
      return mylist; 
      } 
    } 

    //returns a copy of the list 
    public List<String> GetListB 
    { 
     get 
     { 
      List<string> returnList = new List<string>(); 

      foreach (string st in this.mylist) 
      { 
       returnList.Add(st); 
      } 
      return returnList; 
     } 
    } 

    //Returns the list as IEnumerable 
    public IEnumerable<string> GetListC 
    { 
     get 
     { 
      return this.mylist.AsEnumerable<String>(); 
     } 

    } 

} 

ответ

23

Вы можете использовать List(T).AsReadOnly():

return this.mylist.AsReadOnly() 

, который будет возвращать ReadOnlyCollection.

+0

Это в пространстве имен System.Collections.ObjectModel. – mbillard

+0

Да, я удивлен, что я испортил это. –

+2

Конечно, вам нужно будет заменить тип возврата из списка на ReadOnlyCollection или ICollection или IEnumrable Yona

2

Просто используйте класс ReadOnlyCollection, он поддерживается начиная с .NET 2.0

0

Используйте общий класс ReadOnlyCollection (Collection.AsReadOnly()). Он не копирует любые объекты, которые могут иметь некоторые странные результаты при изменении базовой коллекции.

Но если вы не хотите копию, это лучшее решение.

-2

Я предпочитаю возвращать IEnumerable, но вам не нужно бросать. Просто сделайте

public IEnumerable<string> StringList { get { return myList; } 

List<string> является IEnumerable<string>

+0

Проблема с этим становится очень дорогостоящей, чтобы делать такие вещи, как определение количества. –

+7

Настоящая проблема заключается в том, что потребитель кода может в любое время вернуть его в список и изменить список. – Yona

+0

вам не всегда нужно подсчитывать, и нужно разоблачить интерфейс, который дает вам всю необходимую вам функциональность, и никто из вас не должен – Robert

Смежные вопросы