Frage

Ich habe eine Klasseneigenschaft, die eine interne IList<> durch verfügbar macht

System.Collections.ObjectModel.ReadOnlyCollection<>

Wie kann ich einen Teil davon weitergeben? ReadOnlyCollection<> ohne Elemente in ein neues Array zu kopieren (ich benötige eine Live-Ansicht und das Zielgerät hat nicht genügend Speicher)?Ich strebe Compact Framework 2.0 an.

War es hilfreich?

Lösung

Probieren Sie eine Methode aus, die mithilfe von yield eine Aufzählung zurückgibt:

IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}

Andere Tipps

Diese foreach-Beispiele sind in Ordnung, Sie können sie jedoch viel prägnanter gestalten, wenn Sie .NET 3.5 und LINQ verwenden:

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

Sie können jederzeit eine Klasse schreiben, die IList implementiert und alle Aufrufe nach der Übersetzung der Indizes an die Originalliste weiterleitet (damit diese keine eigene Kopie der Daten hat).

Mit yield return können Sie eine gefilterte Liste erstellen

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

Abhängig davon, wie Sie die Sammlung filtern müssen, möchten Sie möglicherweise eine Klasse erstellen, die IList (oder IEnumerable, falls das für Sie funktioniert) implementiert, sich aber mit der Indizierung und dem Zugriff beschäftigt, um nur die gewünschten Werte zurückzugeben.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
}

Wie muss auf die gefilterten Elemente zugegriffen werden?Wenn es über einen Iterator geschieht, könnten Sie dann vielleicht einen benutzerdefinierten Iterator schreiben, der die Elemente überspringt, die nicht öffentlich sichtbar sein sollen?

Wenn Sie eine Sammlung bereitstellen müssen, müssen Sie möglicherweise Ihre eigene Sammlungsklasse schreiben, die lediglich als Proxy für die zugrunde liegende Sammlung fungiert, aber den Zugriff auf die Elemente verhindert, die nicht öffentlich sichtbar sein sollen.

(Haftungsausschluss:Ich bin mit C# nicht sehr vertraut, daher sind dies allgemeine Antworten.Möglicherweise gibt es spezifischere Antworten auf C#, die besser funktionieren)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top