2010-05-05 16 views
8

mam ten sposób (-i):przekazując pustą IEnumerable argumentu metody

void DoSomething(IEnumerable<int> numbers); 

I wywołać tak:

DoSomething(condition==true?results:new List<int>()); 

Zmienna results jest utworzona z LINQ wybranego warunku (IEnumerable).

Zastanawiam się, czy to jest najlepszy sposób (najszybszy?), Aby przekazać pustą kolekcję, czy też jest to new int[0] lepiej? A może coś jeszcze byłoby szybsze, np. Collection? W moim przykładzie null nie byłoby w porządku.

Odpowiedz

27

użyję Enumerable.Empty<int>()

DoSometing(condition ? results : Enumerable.Empty<int>()); 
+0

Nice. Nauczyłem się czegoś dzisiaj! – spender

+0

+1. Nie wiedziałem o Enumerable.Empty – AlwaysAProgrammer

+0

Tego właśnie szukałem! – avance70

1

@ avance70. Naprawdę nie jest to odpowiedź na oryginalne pytanie, ale odpowiedź na pytanie avance70 o IEnumerable z tylko jedną wartością całkowitą. Dodałem go jako komentarz, ale nie mam wystarczającej liczby przedstawicieli, aby dodać komentarz. Jeśli jesteś zainteresowany w ściśle niezmiennej kolejności, masz kilka opcji:

Typowa metoda rozszerzenie:

public static IEnumerable<T> ToEnumerable<T>(this T item) 
{ 
    yield return item; 
} 

Zastosowanie tak:

foreach (int i in 10.ToEnumerable()) 
{ 
    Debug.WriteLine(i); //Will print "10" to output window 
} 

lub to:

int x = 10; 
foreach (int i in x.ToEnumerable()) 
{ 
    Debug.WriteLine(i); //Will print value of i to output window 
} 

lub inna:

int start = 0; 
int end = 100; 
IEnumerable<int> seq = GetRandomNumbersBetweenOneAndNinetyNineInclusive(); 

foreach (int i in start.ToEnumerable().Concat(seq).Concat(end.ToEnumerable())) 
{ 
    //Do something with the random numbers, bookended by 0 and 100 
} 

Niedawno miałem przypadek taki jak powyższy przykład, w którym musiałem "wyodrębnić" kolejne wartości z sekwencji (używając Pomiń i wziąłem), a następnie wstawić i dołączyć wartości początkowe i końcowe. Wartości początkowa i końcowa zostały interpolowane między ostatnią wyodrębnioną wartością a pierwszą wyodrębnioną wartością (dla początku) oraz między ostatnią wyodrębnioną wartością a pierwszą nieekstraną wartością (dla końca). Powstała sekwencja była następnie ponownie włączana, ewentualnie cofania.

Tak więc, jeśli oryginalna sekwencja wyglądał następująco:

może trzeba wyodrębnić 3 i 4, i dodanie wartości interpolowane pomiędzy 2 i 3 i 4 i 5:

2.5 3 4 4.5

Enumerable.Repeat. Używać tak:

foreach (int i in Enumerable.Repeat(10,1)) //Repeat "10" 1 time. 
{ 
    DoSomethingWithIt(i); 
} 

Oczywiście, ponieważ są IEnumerables, można je również stosować w połączeniu z innymi operacjami IEnumerable. Nie jestem pewien, czy są to naprawdę "dobre" pomysły, czy nie, ale powinny one wykonać swoją pracę.

Powiązane problemy