How to create an empty IReadOnlyCollection
I don't think there's anything like Enumerable.Empty
for read-only collections, but:
List<T>
already implementsIReadOnlyCollection<T>
so you can avoid one object allocation by not callingAsReadOnly()
and simply casting the list instead. This is less "safe" in theory but hardly matters in practice.Alternatively, you could cache the returned ReadOnlyCollection to avoid any object allocation whatsoever (except for the cached object).
As far as I know there is no built in way(Interested to know if one). That said, you can use the following:
IReadOnlyCollection<TValue> readonlyCollection = new ReadOnlyCollection<TValue>(new TValue[] { });
Optionally you can cache the results as it is a ReadOnlyCollection
over empty array, It will always be the same no matter how many instances you have.
EDIT: The new .Net 4.6 adds an API to get an empty array: Array.Empty<T>
and arrays implement IReadOnlyCollection<T>
. This also reduces allocations as it only creates an instance once:
IReadOnlyCollection<int> emptyReadOnlyCollection = Array.Empty<int>();
What I ended up doing is mimicking the implementation of Enumerable.Empty
using new TElement[0]
:
public static class ReadOnlyCollection
{
public static IReadOnlyCollection<TResult> Empty<TResult>()
{
return EmptyReadOnlyCollection<TResult>.Instance;
}
private static class EmptyReadOnlyCollection<TElement>
{
static volatile TElement[] _instance;
public static IReadOnlyCollection<TElement> Instance
{
get { return _instance ?? (_instance = new TElement[0]); }
}
}
}
Usage:
IReadOnlyCollection<int> emptyReadOnlyCollection = ReadOnlyCollection.Empty<int>();