Eu tenho uma lista com alguns identificadores como este:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Além disso, tenho outra lista de <T>
itens, representados pelos IDs descritos acima.
List<T> docs = GetDocsFromDb(...)
Preciso manter a mesma ordem nas duas coleções, para que os itens List<T>
estejam na mesma posição que na primeira (devido a razões de pontuação do mecanismo de pesquisa). E esse processo não pode ser feito na GetDocsFromDb()
função.
Se necessário, é possível alterar a segunda lista para outra estrutura ( Dictionary<long, T>
por exemplo), mas eu prefiro não alterá-la.
Existe alguma maneira simples e eficiente de fazer essa "ordenação dependendo de alguns IDs" com o LINQ?
c#
linq
sorting
collections
Borja López
fonte
fonte
docId
ocorre exatamente uma vezdocs
, qual propriedade manterá oId
seletor ou seráFunc<T, long>
necessário?Respostas:
fonte
Id
. Não está especificado na pergunta.IndexOf
é perfeitamente aceitável para o seu exemplo e agradável e simples. Se você tivesse muitos dados, minha resposta poderia ser mais adequada. stackoverflow.com/questions/3663014/…Como você não especifica
T
,É uma extensão genérica para o que você deseja.
Talvez você possa usar a extensão assim,
Uma versão mais segura pode ser
que funcionará se
source
não for exatamente o mesmoorder
.fonte
A resposta de Jodrell é a melhor, mas na verdade ele foi reimplementado
System.Linq.Enumerable.Join
. A associação também usa a Pesquisa e mantém a ordem de origem.fonte
Uma abordagem simples é compactar com a sequência de pedidos:
fonte
Zip
combina cada índice (em uma Tupla) com o documento na mesma posição na lista correspondente. Em seguida, o OrderBy classifica as Tuplas pela parte do índice e, em seguida, o select escava nossos documentos apenas da lista ordenada agora.Item1
não estiver relacionadoItem2
.