So erstellen Sie eine leere IReadOnlyCollection

8

Ich erstelle eine Erweiterungsmethode für MultiValueDictionary um häufige ContainsKey Checks einzukapseln und ich fragte mich, was der beste Weg wäre, um eine leere IReadOnlyCollection zu erstellen ?.

Was ich bisher verwendet habe, ist new List<TValue>(0).AsReadOnly() , aber es muss einen besseren Weg geben, ein Äquivalent zu IEnumerable s Enumerable.Empty

%Vor%     
i3arnon 10.08.2014, 09:46
quelle

4 Antworten

9

EDIT: Das neue .Net 4.6 fügt eine API hinzu, um ein leeres Array zu erhalten: Array.Empty<T> und Arrays implementieren IReadOnlyCollection<T> . Dies reduziert auch die Zuweisung, da nur einmal eine Instanz erstellt wird:

%Vor%

Was ich am Ende gemacht habe, ist die Imitation der Implementierung von Enumerable.Empty mit new TElement[0] :

%Vor%

Verwendung:

%Vor%     
i3arnon 21.11.2014, 14:53
quelle
3

Ich glaube nicht, dass es% %% %% für schreibgeschützte Sammlungen gibt, aber:

  • Enumerable.Empty implementiert bereits List<T> , so dass Sie eine Objektzuordnung vermeiden können, indem Sie nicht IReadOnlyCollection<T> aufrufen und stattdessen die Liste einfach umwandeln. Das ist in der Theorie weniger "sicher", aber in der Praxis kaum.

  • Alternativ können Sie die zurückgegebene ReadOnlyCollection zwischenspeichern, um jegliche Objektzuweisung (mit Ausnahme des zwischengespeicherten Objekts) zu vermeiden.

Victor Efimov 10.08.2014 09:56
quelle
3

Soweit ich weiß, gibt es keinen eingebauten Weg (interessiert zu wissen, ob man). Das heißt, Sie können Folgendes verwenden:

%Vor%

Optional können Sie die Ergebnisse zwischenspeichern, da es ein ReadOnlyCollection über einem leeren Array ist. Es wird immer dasselbe sein, egal wie viele Instanzen Sie haben.

    
Sriram Sakthivel 10.08.2014 09:56
quelle
1

Wie geht es Ihnen, das eine ähnliche Syntax wie Enumerable.Empty:

hat %Vor%

Verwendet wie folgt:

%Vor%     
Steven Rands 21.11.2014 14:30
quelle