2009-11-03 9 views
6

Próbuję zrobić klasę statyczną, dodać do icollection, ale mam pewne problemy, których nie mogę pokonać. w jaki sposób mogę uzyskać ICollection w tej metodzie? przyczyną T jest to, że nie można go rozwiązać.T w klasie? ICollection AddRange?

, a następnie zastanawiam się, czy istnieje sposób na AddRange na icollection?

Myślałem o czymś takim, ale czy nie jestem z tego powodu w porządku?

public static ICollection<T> add(this IEnumerable<T> list) 
    { 
     ICollection<T> collection = null; 

     return collection.AddRange(list);    
    } 
+2

Dlaczego przecenę? –

Odpowiedz

15

Nie ICollection<T> nie ma sposobu AddRange - a nawet gdyby tak się stało, można by próbować dereference null który rzuci NullReferenceException. Nie określiłeś kolekcji, aby dodać listę do ... co dokładnie próbujesz zrobić?

Można stworzyć (powiedzmy) nowy List<T> - i że ma już konieczności skorzystania z konstruktora, który może zabierać IEnumerable<T>:

public static ICollection<T> Add<T>(this IEnumerable<T> list) 
{ 
    return new List<T>(list);    
} 

Jednak w tym momencie masz naprawdę tylko przepisany Enumerable.ToList() i biorąc pod uwagę, że jest to inny typ zwracany ...

Jeśli chcesz dodać wszystko do istniejącego zbioru, to może chcieć coś takiego:

public static ICollection<T> AddTo<T>(this IEnumerable<T> list, 
             ICollection<T> collection) 
{ 
    foreach (T item in list) 
    { 
     collection.Add(item); 
    } 
    return collection; 
} 
+0

Uwielbiam nowe imię ... nie miałem pojęcia, kto to był. :-P –

+0

Brakuje ogólnego argumentu metody :) – leppie

+0

@leppie: Po prostu zauważyłem to w edycji. –

4

Jeśli dobrze rozumiem, chcesz dodać IEnumerable<T> do pustej kolekcji.

nie łatwiej byłoby po prostu zrobić:

ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject()); 

lub nawet:

ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList(); 
+0

Nie wiedziałem, że mogę zrobić ICollection, a następnie wykonaj taką listę. –

+0

'List ' implementuje 'ICollection ' tak tak. –

0

zależności od rodzaju zbiórki swojej listy źródłowej Alternatywnym podejściem jest użycie List(T).ForEach, podobnie jak w :

List<string> source = ... 
ICollection<string> dest = ... 

source.Foreach(dest.Add); 

Jednak czytelność tego jest easy to dispute.

1

Inne sposoby wydają się zakładać, że Twoja ICollection jest pusta i/lub Twój ICollection jest typem Listy. Jednakże, jeśli chcesz AddRange, wówczas można rozszerzyć klasę ICollection następująco:

public static void AddRange<T>(this ICollection<T> ic, IEnumerable<T> ie) 
{ 
    foreach (T obj in ie) 
    { 
     ic.Add(obj); 
    } 
} 

jednak pamiętać, że od impliments Lista kolekcji ICollection, może to spowodować niejasności w kontaktach bezpośrednio z obiektami listy (choć nie mam przetestowane, ale jeśli kompilator będzie w stanie go rozwiązać - moja reakcja polega na tym, że powinien on, ponieważ AddRange jest członkiem List i kompilator przejdzie przez funkcje członkowskie najpierw, zanim spojrzy na rozszerzenia, ale jeśli się mylę Jestem pewien, że ktoś mnie poprawi).

Powiązane problemy