Trier une liste par une autre

J’ai 2 objects de liste, l’un est juste une liste d’ints, l’autre est une liste d’objects mais les objects ont une propriété ID.

Ce que je veux faire, c’est sortinger la liste des objects par son identifiant dans le même ordre de sorting que la liste des ints.

Je joue depuis un moment maintenant pour essayer de le faire fonctionner, jusqu’ici pas de joie,

Voici ce que j’ai jusqu’ici …

//************************** //*** Randomize the list *** //************************** if (Session["SearchResultsOrder"] != null) { // save the session as a int list List IDList = new List((List)Session["SearchResultsOrder"]); // the saved list session exists, make sure the list is orded by this foreach(var i in IDList) { SearchData.ReturnedSearchedMembers.OrderBy(x => x.ID == i); } } else { // before any sorts randomize the results - this mixes it up a bit as before it would order the results by member registration date List RandomList = new List(SearchData.ReturnedSearchedMembers); SearchData.ReturnedSearchedMembers = GloballyAvailableMethods.RandomizeGenericList(RandomList, RandomList.Count).ToList(); // save the order of these results so they can be restored back during postback List SearchResultsOrder = new List(); SearchData.ReturnedSearchedMembers.ForEach(x => SearchResultsOrder.Add(x.ID)); Session["SearchResultsOrder"] = SearchResultsOrder; } 

Tout l’intérêt est que lorsqu’un utilisateur recherche des membres, dans un premier temps, ils affichent dans un ordre aléatoire, alors s’ils cliquent sur la page 2, ils restnt dans cet ordre et les 20 prochains résultats s’affichent.

J’ai lu à propos de l’ICompare que je peux utiliser comme paramètre dans la clause Linq.OrderBy, mais je ne trouve aucun exemple simple.

J’espère une solution de style LINQ élégante et très simple, et je peux toujours espérer.

Toute aide est très appréciée.

Une autre approche LINQ:

  var orderedByIDList = from i in ids join o in objectsWithIDs on i equals o.ID select o; 

Une façon de le faire:

 List order = ....; List items = ....; Dictionary d = items.ToDictionary(x => x.ID); List ordered = order.Select(i => d[i]).ToList(); 

Pas une réponse à cette question exacte , mais si vous avez deux tableaux , il y a une surcharge de Array.Sort qui prend le tableau à sortinger et un tableau à utiliser comme “clé”

https://msdn.microsoft.com/en-us/library/85y6y2d3.aspx

Méthode Array.Sort (Array, Array)
Trie une paire d’objects Array unidimensionnels (l’un contenant les clés et l’autre contenant les éléments correspondants) en fonction des clés du premier tableau à l’aide de l’implémentation IComparable de chaque clé.

Join est le meilleur candidat si vous souhaitez faire correspondre l’entier exact (si aucune correspondance n’est trouvée, vous obtenez une séquence vide). Si vous voulez simplement obtenir l’ordre de sorting de l’autre liste (et à condition que le nombre d’éléments dans les deux listes soit égal), vous pouvez utiliser Zip .

 var result = objects.Zip(ints, (o, i) => new { o, i}) .OrderBy(x => xi) .Select(x => xo); 

Assez lisible

Voici une méthode d’extension qui encapsule la réponse de Simon D. pour les listes de tout type.

 public static IEnumerable SortBy(this IEnumerable sortItems, IEnumerable sortKeys, Func matchFunc) { return sortKeys.Join(sortItems, k => k, matchFunc, (k, i) => i); } 

L’utilisation est quelque chose comme:

 var sorted = toSort.SortBy(sortKeys, i => i.Key); 

Une solution possible:

 myList = myList.OrderBy(x => Ids.IndexOf(x.Id)).ToList(); 

Remarque: utilisez cette option si vous travaillez avec In-Memory listes en In-Memory , ne fonctionne pas avec le type IQueryable , car IQueryable ne contient pas de définition pour IndexOf