¿Se puede usar LINQ en un objeto que expone solo Add(), Remove(), Count(), Item() y GetEnumerator() de System.Collections.IEnumerator?Usando LINQ para un objeto que solo tiene GetEnumerator()
Respuesta
Los métodos de extensión Linq existentes funcionan en objetos que implementar IEnumerable<T>
. Supongo que su objeto implementa la interfaz no genérica IEnumerable
. En ese caso, puede usar el método de extensión Cast<T>
para obtener un contenedor genérico IEnumerable<T>
. Por ejemplo, si los elementos son de tipo int
:
var wrapper = myObject.Cast<int>();
ahora se puede utilizar LINQ en la envoltura
No, no puedes. Todos los métodos LINQ son métodos de extensiones para la interfaz IEnumerable<T>
.
Así que tendrá que implementar IEnumerable<T>
para usar LINQ con sus propias colecciones.
No directamente. Se podría escribir bastante fácilmente un SingleShotEnumerable<T>
sin embargo:
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();
}
}
Esto es suponiendo que realmente tienen un IEnumerator<T>
. Si solo tiene IEnumerator
, puede escribir algo similar solo implementando IEnumerable
, luego use Cast
o OfType
para obtener un IEnumerable<T>
.
(Nota: esto no es seguro para subprocesos Se podía hacerlo así con las cerraduras si realmente quería..)
A continuación, podría hacer:
var filtered = from person in new SingleShotEnumerable<Person>(personEnumerator)
where person.Age > 18
select person.Name;
... pero no podía usar la consulta dos veces
¿Cómo has llegado a la extraña situación de tener solo un IEnumerator<T>
de todos modos? Eso es bastante raro. Vea si puede diseñar su camino para evitar tener que hacer algo como lo anterior, que es bastante frágil.
(Una alternativa sería la de "drenar" el IEnumerator<T>
a un algo List<T>
o similar, pero que tiene problemas relacionados con grandes o potencialmente infinitas secuencias.)
- 1. LINQ lista o solo objeto
- 2. ¿Seleccionar solo el primer objeto en LINQ?
- 3. ¿Cómo usar LINQ para seleccionar un objeto?
- 4. asp.net CompositeDataBoundControl para un solo objeto
- 5. LINQ Contiene método para un objeto
- 6. .Net ¿Repetidor equivalente para un solo objeto?
- 7. Usando el objeto DataGridViewRowCollection en LINQ
- 8. ¿Cómo puedo obtener LINQ para devolver el objeto que tiene el valor máximo para una propiedad determinada?
- 9. Cómo persistir un objeto que tiene un campo de enumeración
- 10. LINQ: Búsqueda de una colección dentro de una colección para un solo objeto
- 11. Problema La construcción de un solo proyecto usando msbuild que tiene varias configuraciones
- 12. Estructura de la memoria de un objeto que solo funciona?
- 13. WPF Aplicación que solo tiene un ícono de bandeja
- 14. Verificar que un objeto tiene una cierta propiedad
- 15. Serializar un objeto que tiene una clase primaria no serializable
- 16. ¿Tiene un solo menú en varias páginas?
- 17. ¿Cómo verifico los métodos que tiene un objeto en Python?
- 18. Usando LINQ no es igual
- 19. ¿Cómo insertar solo nuevos registros usando Linq-to-SQL?
- 20. Usando un objeto como clave para NSDictionary
- 21. ¿Usando Parcel para clonar un objeto?
- 22. Replicar el comportamiento de LINQ to Entities en pruebas unitarias que usan LINQ para el objeto
- 23. Usando LINQ con clases que implementan ICollection no genérico
- 24. Usando Linq para seleccionar el valor máximo en un grupo
- 25. IEnumerable.GetEnumerator() y IEnumerable <T> .GetEnumerator()
- 26. Usando LINQ, ¿cómo puedo encontrar un objeto con un valor de propiedad dado de una lista?
- 27. ¿Tiene un objeto de gráfico abierto que corresponda a una página visible para el usuario?
- 28. población objeto con LINQ
- 29. Cómo pasar un solo objeto [] a un objeto params []
- 30. Usando LINQ con NHibernate
Algunos tipos 'System.Windows.Forms', como' ListViewItemCollection', no parecen implementar 'IEnumerable'. –
@ChrisAkridge: De hecho, solo implementan el 'IEnumerable' no genérico. Pero siempre puedes llamar 'Cast <>' para crear un 'IEnumerable' desde él. –