2008-09-02 9 views
10

Ich habe eine Klasse Eigenschaft eine interne IList <> durchWie kann ich nur ein Fragment von IList <>?

System.Collections.ObjectModel.ReadOnlyCollection<> 

Belichtungs Wie kann ich einen Teil dieser ReadOnlyCollection<> ohne Elemente in ein neues Array zu kopieren (Ich brauche eine Live-Ansicht, und das Zielgerät ist kurz passieren auf Speicher)? Ich ziele auf Compact Framework 2.0.

Antwort

14

ein Verfahren Versuchen, die eine Aufzählung mit Ertrag zurückgibt:

1

Sie können immer eine Klasse schreiben, die IList implementiert und alle Aufrufe an die ursprüngliche Liste weiterleitet (so dass sie keine eigene Kopie der Daten hat), nachdem die Indizes übersetzt wurden.

1

könnten Sie yield return verwenden, um eine gefilterte Liste

IEnumerable<object> FilteredList() 
{ 
    foreach(object item in FullList) 
    { 
     if(IsItemInPartialList(item) 
      yield return item; 
    } 
} 
0

So erstellen Sie die gefilterten Elemente zugegriffen werden? Wenn es durch einen Iterator geht, könnten Sie vielleicht einen benutzerdefinierten Iterator schreiben, der die Elemente überspringt, die Sie nicht öffentlich sichtbar machen wollen?

Wenn Sie eine Sammlung bereitstellen müssen, müssen Sie möglicherweise eine eigene Collection-Klasse schreiben, die nur der zugrunde liegenden Collection als Proxies dient, aber den Zugriff auf die Elemente verhindert, die nicht öffentlich sichtbar sein sollen.

(Disclaimer: Ich bin nicht sehr vertraut mit C#, so sind diese allgemeine Antworten Es kann mehr konkrete Antworten auf C#, die besser funktionieren.)

1

Je nachdem, wie Sie die Auflistung filtern müssen, möchten Sie möglicherweise eine Klasse erstellen, die IList (oder IEnumerable implementiert, wenn das für Sie funktioniert), aber die Indizierung und den Zugriff nur die Werte zurückgibt wollen. Zum Beispiel

class EvenList: IList 
{ 
    private IList innerList; 
    public EvenList(IList innerList) 
    { 
     this.innerList = innerList; 
    } 

    public object this[int index] 
    { 
     get { return innerList[2*i]; } 
     set { innerList[2*i] = value; } 
    } 
    // and similarly for the other IList methods 
} 
8

Diese foreach Proben sind in Ordnung, wenn man sich viel mehr terse machen kann, wenn Sie .NET 3.5 und LINQ mit:

return FullList.Where(i => IsItemInPartialList(i)).ToList(); 
Verwandte Themen