Tengo una lista ordenada de Personas. Tengo una persona que sé que existe en esa colección. ¿Cómo puedo determinar qué persona es la siguiente en la lista?Usando Linq para encontrar el elemento después de un elemento especificado en una colección
Respuesta
se podría hacer algo como esto:
IEnumerable<Person> persons = ..
var firstPersonAfterJack = persons.SkipWhile(p => p.Name != "Jack")
.ElementAt(1); //Zero-indexed, means second
La idea es producir una secuencia que resulta en elementos de saltar hasta que cumpla con la condición, a continuación, tomar el segundo elemento de que secuencia.
Si no hay garantía de que la consulta devolverá un resultado (por ejemplo, un partido no se encuentra, o es el último elemento de la secuencia), podría reemplazar ElementAt
con ElementAtOrDefault
, y luego hacer un null
-test para comprobar si hay exito fracaso.
Noté que dices en tu pregunta que tienes un ordenado lista de personas. Si pudiera explicar lo que eso significa en mayor detalle, podríamos ofrecer una mejor respuesta (por ejemplo, puede que no tengamos que buscar linealmente la secuencia).
SkipWhile
es un método que toma un predicado y omite todo hasta que el predicado sea falso. Devuelve ese elemento y todo después.
var remainingPeople = collectionOfPeople.SkipWhile(p => !isThePerson(p));
if (remainingPeople.Count() == 1)
{
// the person was the last in the list.
}
var nextPerson = remainingPeople.Skip(1).First();
donde isThePerson
es un método que toma una persona y devuelve verdadero si es la persona a la que le está interesado.
Hay 2 problemas aquí: 1) Hay una enumeración redundante de la secuencia fuente * completa *. 2) Fallará cuando 'remainingPeople.Count() == 0', es decir, la condición nunca se cumple. – Ani
1) No veo dónde enumera toda la secuencia dos veces. ¿Puedes señalar dónde? 2) Fallará si no está en la lista pero los requisitos dicen que la persona está garantizada en la lista, por lo que no es un problema. –
Recuerde que la mayoría de los operadores LINQ usan ejecución diferida. 'remainingPeople' es una * consulta *, no una lista o matriz. Sus resultados se recuperan dos veces, una para 'Count()' y una para 'Skip (1) .First()'. – Ani
- 1. Linq: Encontrar elemento en una colección
- 2. Encontrar el elemento antes y después de un elemento específico
- 3. Insertar un elemento en una colección backbone.js
- 4. Eliminar un elemento de una colección (NHibernate)
- 5. Backbone.js: Eliminar un elemento de una colección
- 6. Encontrar el primer elemento de cierto tipo en una lista usando LINQ
- 7. Colección modificar elemento
- 8. ¿Cómo puedo obtener el primer elemento después de un elemento con LINQ-to-XML?
- 9. El elemento especificado ya es el elemento lógico de otro elemento. Desconectar primero
- 10. Encontrar el primer índice del elemento que coincida con una condición usando LINQ
- 11. elemento siguiente en todo el documento * * después de cierto elemento
- 12. Python: encontrar un elemento en una matriz
- 13. selector de jQuery para encontrar el primer elemento después de un elemento dado que coincide con un selector de
- 14. LINQ elemento de proyección
- 15. Consultar y actualizar una propiedad en una colección usando LINQ
- 16. ¿Cómo encontrar el índice de un elemento en una lista?
- 17. Asignar una propiedad a un elemento de colección
- 18. Observable Colección reemplazar elemento
- 19. Observable Colección propiedad modificada en el elemento en la colección
- 20. ¿Cómo inserto un elemento en XML usando Linq?
- 21. Encontrar un elemento en una lista <> con C#
- 22. Contando palabras en una colección usando LINQ
- 23. jQuery: Agregar elemento después del enésimo elemento
- 24. LINQ: Consulta si la colección contiene algún elemento en otra colección
- 25. jQuery: Agregar elemento después de otro elemento
- 26. ¿Cómo encontrar el div antes de un elemento especificado con jQuery?
- 27. Buscar elemento con índice Z especificado
- 28. obtener el siguiente elemento con una clase específica después de un elemento específico
- 29. Encontrar un elemento específico en un NSArrayController
- 30. Encontrar un elemento que coincida con el predicado en Scala
Acaba de vencerme a mí :-) – finnw
@finnw: Incluso elegimos el mismo nombre de propiedad. Imagina si hubiéramos elegido el mismo nombre de persona también. :) – Ani
Esta es una gran solución para una consulta genérica de Linq to Object, pero el operador de consulta 'SkipWhile' no es compatible en Linq con Sql. –