13

コレクションを含むクラスがあります。コレクションの内容を返すメソッドまたはプロパティを提供したいと考えています。呼び出しクラスが個々のオブジェクトを変更できる場合は問題ありませんが、実際のコレクションからオブジェクトを追加または削除したくありません。すべてのオブジェクトを新しいリストにコピーしてきましたが、今はリストを 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>();
        }

    }

}
4

4 に答える 4

26

使用できますList(T).AsReadOnly()

return this.mylist.AsReadOnly()

を返しますReadOnlyCollection

于 2009-05-12T17:31:50.233 に答える
2

ReadOnlyCollection クラスを使用するだけで、.NET 2.0 以降でサポートされています

于 2009-05-12T17:31:41.250 に答える
0

一般的な ReadOnlyCollection クラス ( Collection.AsReadOnly()) を使用します。基になるコレクションが変更されたときに奇妙な結果になる可能性のあるオブジェクトはコピーしません。

        var foo = new List<int> { 3, 1, 2 };
        var bar = foo.AsReadOnly();

        foreach (var x in bar) Console.WriteLine(x);

        foo.Sort();

        foreach (var x in bar) Console.WriteLine(x);

しかし、コピーが必要ない場合は、それが最善の解決策です。

于 2009-05-12T17:36:45.173 に答える
-2

私は IEnumerable を返すことを好みますが、キャストする必要はありません。やるだけ

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

List<string>ですIEnumerable<string>

于 2009-05-12T17:42:00.297 に答える