web-dev-qa-db-ja.com

Java Collections。<T> emptyList()?)に相当するC#/ .NET

C#で型付きの読み取り専用の空のリストを取得する標準的な方法は何ですか?それともありますか?

ETA:「なぜ?」と尋ねる人のために:私はIList(というより、ポストアンサー、IEnumerable)を返す仮想メソッドを持っています。デフォルトの実装は空です。リストへの書き込みはバグになるため、リストが返すものはすべて読み取り専用にする必要があります。誰かがそうしようとすると、後でバグが微妙に現れるのを待つのではなく、すぐに停止して発火したいと思います。

34
David Moles

個人的には、これは他のどの答えよりも優れていると思います。

_static readonly IList<T> EmptyList = new T[0];
_
  • 配列は_IList<T>_を実装します。
  • 配列に追加することはできません。
  • 空の配列の要素に割り当てることはできません(そこにis noneがあるため)。
  • 私の意見では、これはnew List<T>().AsReadOnly()よりもはるかに単純です。
  • それでも_IList<T>_を返すことができます(必要な場合)。

ちなみに、私が正しく思い出せば、これはEnumerable.Empty<T>()が実際に内部で使用しているものです。したがって、理論的には_(IList<T>)Enumerable.Empty<T>()_を実行することもできます(ただし、それを実行する正当な理由はわかりません)。

25
Dan Tao

リストを作成するだけです。

_List<MyType> list = new List<MyType>();
_

空の_IEnumerable<T>_が必要な場合は、 Enumerable.Empty<T>() を使用します。

_IEnumerable<MyType> collection = Enumerable.Empty<MyType>();
_

読み取り専用リストが本当に必要な場合は、次のようにすることができます。

_IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();
_

これは _ReadOnlyCollection<T>_ を返し、_IList<T>_を実装します。

23
Reed Copsey
IList<T> list = new List<T>().AsReadOnly();

または、IEnumerable<>が必要な場合:

IEnumerable<T> sequence = Enumerable.Empty<T>();
8
LukeH

.net 4.6以降では、次のものも使用できます。

IList<T> emptyList = Array.Empty<T>();

これにより、Tとして指定したさまざまなタイプごとに1回だけ新しいインスタンスが作成されます。

7
haindl

内容を変更できないリストが必要な場合は、次のようにすることができます。

ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();
4
Bryan Watts

リストから System.Collections.ObjectModel.ReadOnlyCollection のインスタンスを作成します。

List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);
2
Richard Cook

Dan Taoの回答 を拡張するには、代わりにEnumerable.Empty<T>()を指定することにより、次の実装をList.Empty<T>()と同じように使用できます。

public static class List
{
    public static IList<T> Empty<T>()
    {
        // Note that the static type is only instantiated when
        // it is needed, and only then is the T[0] object created, once.
        return EmptyArray<T>.Instance;
    }

    private sealed class EmptyArray<T>
    {
        public static readonly T[] Instance = new T[0];
    }
}

編集:上記のコードを変更して、Instanceフィールドの怠惰な初期化と熱心な初期化に関するDanTaoとの話し合いの結果を反映します。