2017-07-06 1 views
0

J'ai besoin de trier une liste en utilisant une autre liste. Je suis en train d'utiliser:Comment puis-je trier une liste <int> en utilisant une autre liste <int>?

var docsIds = new List<int>() { 1, 7, 4 }; 
var tileSizes = new List<int>(); 
tileSizes = tileSizes.OrderBy(x => docsIds.IndexOf()); 

Entrée: 1,2,3,4,5,6,7

Résultats escomptés: 1,7,4,2,3,5,6

Toute aide est appréciée.

+3

Entrée de test et les résultats escomptés seraient utiles –

+0

https://stackoverflow.com/ questions/3945935/tri-one-list-by-another, https://stackoverflow.com/questions/15275269/sort-a-list-from-another-list-ids, https://stackoverflow.com/questions/ 3470098/list-sort-based-on-another-list, https://stackoverflow.com/questions/14227757/sort-one-list-based-on-another – CodeCaster

+0

@CodeCaster Je ne peux pas utiliser ceci: docs = docs.OrderBy (d => docsIds.IndexOf (d.Id)). ToList(); car je n'ai pas d'identifiant dans les docs. –

Répondre

3

En supposant que tileSizes a que des valeurs choisies parmi docIds (ce qui semble être l'intention, bien que la question est un peu claire), la pièce manquante est un paramètre à IndexOf(), en particulier IndexOf(x).

IndexOf() Ensuite, IndexOf() renvoie un entier indiquant où la valeur serait docIds et OrderBy() peut l'utiliser dans le tri.

Oh, c'est vrai. Et OrderBy() ne renvoie pas un List, mais plutôt un Enumerable, donc vous aurez besoin d'un ToList() à la fin. Putting que tous ensemble, votre dernière ligne devrait être quelque chose comme ...

tileSizes = tileSizes.OrderBy(x => docsIds.IndexOf(x)).ToList(); 
0

J'aime habituellement faire les choses un peu plus manuellement, donc il est ma solution:

List<int> randomItems = new List<int>(){1,2,3,4,5,6,7}; 
List<int> outputOrder = new List<int>(){0,6,3,1,2,4,5}; 
List<int> resultList = new List<int>(); 

foreach(int order in outputOrder) 
{ 
    resultList.Add(randomItems[order]); 
} 

Edité pour pour répliquer les valeurs OP

le contiendra de résultats: 1,7,4,2,3,5,6

Sinon, vous pouvez avoir le outputorder comme ceci:

List<int> outputOrder = new List<int>(){1,7,4,2,3,5,6}; 

et simplement changer l'instruction de boucle:

resultList.Add(randomItems[order--]); 

Et le résultat sera le même.

+0

Je sais que ce n'est pas la solution la plus efficace, mais au moins vous pouvez mettre un point d'arrêt et voir ce qui se passe et avoir le contrôle. – DGaspar

+1

Je pense que l'OP veut que la liste des résultats soit triée en fonction de la liste outputOrder, ce qui signifie qu'il devrait être {1, 2, 14, 95, 45} ' –

+0

Que faire si les listes n'ont pas la même valeur? ? –

0

Si tileSizes sont distincts et contiennent toujours tous docsIds, Union peut être utilisé pour un O (n) complexité:

tileSizes = docsIds.Union(tileSizes).ToList();  // { 1, 7, 4, 2, 3, 5, 6 }