En ASP.NET C # tengo una estructura:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
y tengo una lista de esos. Quiero seleccionar category_id
y category_name
, ejecutando un DISTINCT
y finalmente un ORDERBY
encendido category_name
.
Esto es lo que tengo ahora:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
Obviamente, esto solo obtiene el nombre de la categoría. Mi pregunta es, ¿cómo obtengo múltiples campos y en qué estructura de datos almacenaré esto (no a string[]
)?
EDITAR
Usar una lista de estructuras no está establecido en piedra. Si fuera aconsejable cambiar mi estructura de datos de respaldo para facilitar las selecciones (escribiré muchos de estos), con mucho gusto tomaré recomendaciones.
c#
linq
data-structures
Chet
fuente
fuente
Respuestas:
Los tipos anónimos le permiten seleccionar campos arbitrarios en estructuras de datos que se tipean más adelante en su código:
Dado que (aparentemente) necesita almacenarlo para su uso posterior, puede usar el operador GroupBy:
fuente
Select
en un nuevo tipo. En mi caso seleccioné uno nuevoKeyValuePair
.Editar : lo hizo más LINQ-ey!
fuente
Podrías usar un tipo anónimo:
El compilador generará el código para una clase con
name
ycategory_name
propiedades y devolverá instancias de esa clase. También puede especificar manualmente los nombres de propiedad:Puede tener un número arbitrario de propiedades.
fuente
Puede seleccionar múltiples campos usando linq Select como se muestra arriba en varios ejemplos, esto devolverá como un tipo anónimo. Si desea evitar este tipo anónimo, aquí está el simple truco.
Creo que esto resuelve tu problema
fuente
Esta es una tarea para la que los tipos anónimos son muy adecuados. Puede devolver objetos de un tipo creado automáticamente por el compilador, inferido del uso.
La sintaxis es de esta forma:
Para su caso, intente algo como lo siguiente:
fuente
Utiliza tipos anónimos, por lo que debe usar la palabra clave var, ya que el tipo resultante de la expresión no se conoce de antemano.
fuente
fuente
Puede convertirlo en un KeyValuePair, por lo que devolverá un
"IEnumerable<KeyValuePair<string, string>>"
Entonces, será así:
fuente
fuente