Me encuentro escribiendo mucho código como este para seleccionar un elemento que coincide
var item = (from x in Items where x.Id == 123 select x).First();
¿Existe una forma más limpia de hacerlo o es tan conciso como voy a conseguir?
EDITAR: Debería haber dicho "Manera más limpia usando la sintaxis linq". Ya era consciente de la sintaxis lambda y parece que esta es la única forma. Sin embargo, obtuve información útil, así que gracias a todos los que respondieron.
Single()
ySingleOrDefault()
SI sé que los datos ya son únicos (por ejemplo, de una base de datos que tiene esa restricción, etc.), yaSingle()
que lo obliga a escanear el resto de la lista para encontrar un posible duplicado, pero ese soy yo. Si necesita hacer valer su singularidad en este punto, useSingle()
family, si no, useFirst()
family.Respuestas:
Depende de cuánto le guste la sintaxis de consulta linq, puede usar los métodos de extensión directamente como:
Y si no desea lanzar un error si la lista está vacía, use
FirstOrDefault
que devuelve el valor predeterminado para el tipo de elemento (null
para tipos de referencia):Single()
ySingleOrDefault()
también se puede usar, pero si está leyendo de una base de datos o algo que ya garantiza la singularidad, no me molestaría, ya que tiene que escanear la lista para ver si hay duplicados y lanzamientos.First()
y seFirstOrDefault()
detienen en el primer partido, para que sean más eficientes.De la familia
First()
ySingle()
, aquí es donde tiran:First()
- lanza si está vacío / no se encuentra, no lanza si está duplicadoFirstOrDefault()
- devuelve el valor predeterminado si está vacío / no se encuentra, no lanza si está duplicadoSingle()
- lanza si está vacío / no se encuentra, lanza si existe un duplicadoSingleOrDefault()
- devuelve el valor predeterminado si está vacío / no se encuentra, arroja si existe un duplicadofuente
i.Id == 123
FirstOrDefault o SingleOrDefault pueden ser útiles, dependiendo de su escenario, y si desea manejar que haya cero o más de una coincidencia:
No sé cómo funciona esto en una consulta linq 'desde', pero en la sintaxis lambda se ve así:
fuente
Estos son los métodos preferidos:
O
fuente
Solo para facilitarle la vida a alguien, la consulta linq con expresión lambda
da como resultado una consulta SQL con un
select top (1)
.fuente
Eso se puede condensar mejor en esto.
var item = Items.First(x => x.Id == 123);
Su consulta actualmente está recopilando todos los resultados (y puede haber más de uno) dentro del enumerable y luego tomando el primero de ese conjunto, haciendo más trabajo del necesario.
Single / SingleOrDefault valen la pena, pero solo si desea recorrer toda la colección y verificar que la coincidencia es única además de seleccionar esa coincidencia. First / FirstOrDefault simplemente tomará la primera coincidencia y se irá, independientemente de cuántos duplicados existan realmente.
fuente
Puede usar la sintaxis del método de extensión:
Aparte de eso, no estoy seguro de cuánto más conciso puede ser, sin quizás escribir sus propios métodos de extensión especializados "First" y "FirstOrDefault".
fuente
Where
lo opuesto aSelect
, que ya se ha dicho, pero esta respuesta es incorrecta. Seleccionar en c # cambia los resultados a IEnumerable <bool>, por lo que obtendrá unbool
para el primer elementox.Id == 123
Te diré lo que funcionó para mí:
Mi identificación es la fila que quiero consultar, en este caso la obtuve de un radGrid, luego la usé para consultar, pero esta consulta devuelve una fila, luego puede asignar los valores que obtuvo de la consulta al cuadro de texto, o cualquier cosa , Tuve que asignarlos al cuadro de texto.
fuente