È possibile utilizzare LINQ in un oggetto che espone solo Aggiungi(), Rimuovi(), Count(), Item() e GetEnumerator() da System.Collections.IEnumerator?Utilizzo di LINQ per un oggetto con GetEnumerator()
risposta
I metodi di estensione Linq esistenti funzionano su oggetti che attuare IEnumerable<T>
. Presumo che il tuo oggetto implementa l'interfaccia non generica IEnumerable
. In tal caso, è possibile utilizzare il metodo di estensione Cast<T>
per ottenere un wrapper generico IEnumerable<T>
. Per esempio, se gli elementi sono di tipo int
:
var wrapper = myObject.Cast<int>();
è ora possibile utilizzare Linq su un involucro
No, non è possibile. Tutti i metodi LINQ sono metodi di estensione per l'interfaccia IEnumerable<T>
.
Quindi sarà necessario implementare IEnumerable<T>
per utilizzare LINQ con le proprie raccolte.
Non direttamente. Si potrebbe abbastanza facilmente scrivere un SingleShotEnumerable<T>
però:
public sealed class SingleShotEnumerable<T> : IEnumerable<T>
{
private IEnumerator<T> enumerator;
public SingleShotEnumerable(IEnumerator<T> enumerator)
{
if (enumerator == null)
{
throw new ArgumentNullException("enumerator");
}
this.enumerator = enumerator;
}
public IEnumerator<T> GetEnumerator()
{
if (enumerator == null)
{
throw new InvalidOperationException
("GetEnumerator can only be called once");
}
var ret = enumerator;
enumerator = null;
return ret;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Questo si sta assumendo realtà hanno un IEnumerator<T>
. Se hai solo IEnumerator
, potresti scrivere qualcosa di simile implementando solo IEnumerable
, quindi usa Cast
o OfType
per arrivare a un IEnumerable<T>
.
(Nota: questo non è thread-safe Si potrebbe fare in modo con le serrature se si voleva davvero..)
È quindi possibile fare:
var filtered = from person in new SingleShotEnumerable<Person>(personEnumerator)
where person.Age > 18
select person.Name;
... ma si couldn usare la query due volte
Come sei entrato nella strana situazione di avere solo uno IEnumerator<T>
? Questo è abbastanza raro. Vedi se riesci a orientarti in modo da evitare di dover fare qualcosa come il precedente, che è piuttosto fragile.
(Un'alternativa sarebbe quella di "drain" del IEnumerator<T>
ad un qualcosa List<T>
o simile, ma che non ha problemi a gestire un grande o potenzialmente infinite sequenze.)
- 1. Oggetto con LINQ
- 2. Utilizzo di Parcel per clonare un oggetto?
- 3. Linq metodo contiene per un oggetto
- 4. Utilizzo di LINQ per generare numeri primi
- 5. Quando utilizzare IEnumerable e GetEnumerator?
- 6. Aggiornamento di un oggetto LINQ disconnesso con MVC Framework RC1
- 7. Utilizzo di LINQ con classi che implementano ICollection non generico
- 8. Utilizzo di $ .getJSON() con callback all'interno di un oggetto Javascript
- 9. Utilizzo di un delegato anonimo per restituire un oggetto
- 10. Utilizzo di Linq su MembershipUserCollection
- 11. Utilizzo di Linq su un risultato del modello Oggetto client dal punto di divisione
- 12. AngularJS - Utilizzo di $ resource.query con oggetto params
- 13. Aggiornamento proprietà a raccolta oggetto con LINQ
- 14. Linq per SQL Allegare/aggiornare oggetto Entity
- 15. Utilizzo di C# per serializzare un oggetto deserializzabile Java
- 16. Utilizzo di DateInterval per aggiungere settimane a un oggetto DateTime
- 17. Utilizzo di JSON per creare un oggetto in Groovy/Grails
- 18. Linq dinamico - Esegui una query su un oggetto con membri di tipo "dinamico"
- 19. Esiste un metodo Linq per aggiungere un singolo elemento a un oggetto IEnumerable <T>?
- 20. Utilizzo dell'oggetto DataGridViewRowCollection in LINQ
- 21. LINQ OrderBy oggetto anonimo con comparatore di proiezione
- 22. Utilizzo di LINQ to SQL per la copia tra database
- 23. Utilizzo di DateTime in LINQ alle entità
- 24. Utilizzando LINQ, come trovo un oggetto con un valore di proprietà dato da un elenco?
- 25. Esclude elementi di un elenco in un altro con tipi di dati oggetto diversi, LINQ?
- 26. Utilizzo di xname in Linq-to-xml
- 27. Utilizzo di ToString() nelle query LINQ?
- 28. Utilizzo delle proprietà di lettura riflessa di un oggetto contenente una matrice di un altro oggetto
- 29. Utilizzo di LINQ per analizzare i numeri da una stringa
- 30. Come implementare IEnumerable <T> con GetEnumerator()?
Alcuni tipi 'System.Windows.Forms', come' ListViewItemCollection', non sembrano implementare 'IEnumerable'. –
@ChrisAkridge: Effettivamente, implementano solo l'IEnumerable non generico. Ma puoi sempre chiamare 'Cast <>' per creare un 'IEnumerable' da esso. –