2011-02-10 17 views
15

Czy C# oferuje dobrą metodę rzutowania pojedynczej jednostki typu T na IEnumerable<T>?Jak utworzyć singleton IEnumerable?

Jedynym sposobem mogę myśleć o coś takiego jak:

T entity = new T(); 
IEnumerable<T> = new List { entity }.AsEnumerable(); 

I chyba nie powinno być lepszy sposób.

+3

możliwe duplikat: http://stackoverflow.com/questions/4779442/return-single-instance-object-as-ienumerable – Justin

+0

możliwe duplikat [Przechodząc jedną pozycję jak IEnumerable ] (http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal

Odpowiedz

21

wezwanie do AsEnumerable() jest niepotrzebna. AsEnumerable jest zwykle używany w przypadkach, gdy obiekt docelowy implementuje IQueryable<T>, ale chcesz wymusić na nim użycie LINQ-to-Objects (podczas filtrowania po stronie klienta na ORM zgodnej z LINQ, na przykład). Od List<T> implementuje IEnumerable<T>, ale nie IQueryable<T>, nie ma takiej potrzeby.

W każdym razie możesz również utworzyć element z pojedynczą tablicą;

IEnumerable<T> enumerable = new[] { t }; 

Albo Enumerable.Repeat

IEnumerable<T> enumerable = Enumerable.Repeat(t, 1); 
+0

Uwagi: składnia konstruktora tablic jest znacznie bardziej wydajna (ale taka mikrooptymalizacja często nie ma znaczenia); Z drugiej strony metoda powtarzania jest niezmienna. –

+1

Podoba mi się ten Enumerable.Repeat pozwala ci ukryć typ podkładu. Ponadto zakładam, że Sprague

+0

@Sprague: Jeśli przez "ukryj typ kopii", masz na myśli możliwość wywoływania 'Powtórzenia' bez jawnego określania ogólnych argumentów, wtedy niejawna składnia tablicowa (' new [] {t} ') robi to samo rzecz. –

5

używam

Enumerable.Repeat(entity, 1); 
4
var entity = new T(); 
var singleton = Enumerable.Repeat(entity, 1); 

(Choć pewnie po prostu zrobić var singleton = new[] { entity }; w większości sytuacji, zwłaszcza, jeśli to było tylko do użytku prywatnego.)

+0

Dziwnie VB.NET jest mniej gadatliwy niż C#! Tworzenie tablicy to po prostu '{entity}'. –

+2

@Martinho: W C# możesz zrobić 'T [] x = {y}' lub 'var x = new [] {y}', ale nie 'var x = {y}'. – LukeH