No ASP.NET C #, tenho uma estrutura:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
e eu tenho uma lista deles. Quero selecionar category_id
e category_name
, executando um DISTINCT
e, finalmente, um ORDERBY
diante category_name
.
Aqui está o que eu tenho agora:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
Obviamente, isso apenas recebe o nome da categoria. Minha pergunta é: como obtenho vários campos e em qual estrutura de dados armazenarei isso (não a string[]
)?
EDITAR
O uso de uma lista de estruturas não é definido como pedra. Se seria aconselhável alterar minha estrutura de dados de apoio para facilitar as seleções (eu escreverei muitas delas), então eu ficaria feliz em fazer recomendações.
c#
linq
data-structures
Chet
fonte
fonte
Respostas:
Tipos anônimos permitem selecionar campos arbitrários em estruturas de dados que são fortemente digitadas posteriormente no seu código:
Como você (aparentemente) precisa armazená-lo para uso posterior, você pode usar o operador GroupBy:
fonte
Select
em um novo tipo. No meu caso, selecionei um novoKeyValuePair
.Edit : Tornou mais LINQ-ey!
fonte
Você pode usar um tipo anônimo:
O compilador irá gerar o código para uma classe com
name
ecategory_name
propriedades e retorna instâncias dessa classe. Você também pode especificar manualmente os nomes das propriedades:Você pode ter um número arbitrário de propriedades.
fonte
Você pode selecionar vários campos usando linq Select, como mostrado acima em vários exemplos, isso retornará como um Tipo Anônimo. Se você deseja evitar esse tipo anônimo, aqui está o truque simples.
Eu acho que isso resolve seu problema
fonte
Essa é uma tarefa para a qual tipos anônimos são muito adequados. Você pode retornar objetos de um tipo que é criado automaticamente pelo compilador, deduzido do uso.
A sintaxe é desta forma:
Para o seu caso, tente algo como o seguinte:
fonte
Isso usa tipos anônimos, portanto, você deve usar a palavra-chave var, pois o tipo resultante da expressão não é conhecido antecipadamente.
fonte
fonte
Você pode torná-lo um KeyValuePair, para que ele retorne um
"IEnumerable<KeyValuePair<string, string>>"
Então, será assim:
fonte
fonte