2009-11-03 2 views
6

Ich versuche, statische Klasse zu tun, fügen Sie zu icollection hinzu, aber ich habe einige Probleme, die ich scheinen kann zu überwinden. das ist, wie ich bekomme, so kann ich eine ICollection in der Methode übergeben? Ursache T ist, dass es nicht aufgelöst werden kann.T in der Klasse? AddRange ICollection?

und dann frage ich mich, gibt es eine Möglichkeit, AddRange auf icollection zu tun?

ich dachte an so etwas, aber irgendwie bin ich weit weg damit?

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

     return collection.AddRange(list);    
    } 
+2

Warum der Abschlag? –

Antwort

15

Nein, ICollection<T> keine AddRange Methode haben - und selbst wenn es so wäre, dann würden Sie zu dereferenzieren null versuchen, die eine NullReferenceException werfen. Sie haben keine Sammlung angegeben, zu der Sie die Liste hinzufügen möchten ... was genau möchten Sie tun?

Sie könnten erstellen (sagen wir) einen neuen List<T> - und das hat den Vorteil, bereits einen Konstruktor, die eine IEnumerable<T> nehmen:

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

, Sie haben wirklich Enumerable.ToList() nur reimplementiert an diesem Punkt jedoch und es ist ein anderer Rückgabetyp gegeben ...

Wenn Sie alles zu einer bestehenden Sammlung hinzufügen mögen, können Sie so etwas wie dies wollen:

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

Liebe den neuen Namen ... hatte keine Ahnung wer es auch war. :-P –

+0

Sie vermissen ein generisches Methodenargument :) – leppie

+0

@leppie: Habe das gerade in einem Schnitt entdeckt. –

4

Wenn ich richtig verstanden habe, möchten Sie eine IEnumerable<T> zu einer leeren Sammlung hinzufügen.

Wäre es nicht einfacher sein, nur tun:

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

Oder auch:

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

Ich wusste nicht, dass ich eine ICollection machen könnte, dann mache ich die Liste so. –

+0

'Liste ' implementiert 'ICollection ' so yup. –

0

Je nach Kollektionstyp Ihrer Quellenliste ein alternativer Ansatz ist List(T).ForEach zu verwenden, wie in :

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

source.Foreach(dest.Add); 

Allerdings ist die Lesbarkeit dieser easy to dispute.

1

Die anderen Möglichkeiten scheinen davon auszugehen, dass Ihre ICollection leer ist und/oder Ihre ICollection eine Art Liste ist. Wenn Sie jedoch AddRange wollen, dann können Sie die ICollection-Klasse erweitern, wie folgt:

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

Beachten Sie jedoch, dass seit Liste impliments ICollection, diese Zweideutigkeit führen kann, wenn sie direkt mit dem Listenobjekten zu tun (obwohl ich nicht haben getestet, aber wenn der Compiler in der Lage sein wird, es aufzulösen - meine gute Reaktion ist, dass es sollte, da AddRange ein Mitglied von List ist und der Compiler zuerst Mitgliederfunktionen durchgehen wird, bevor er sich Erweiterungen ansieht, aber wenn ich falsch liege Ich bin mir sicher, dass mich jemand korrigieren wird.

Verwandte Themen