75 votes

Trier C# liste par un autre

J'ai 2 objets de la liste, on est juste une liste d'entiers, l'autre est une liste d'objets, mais les objets qu'il a un ID de propriété.

Ce que je veux faire est de trier la liste des objets par son ID dans le même ordre de tri dans la liste d'entiers.

Ive été jouer pour un certain temps maintenant d'essayer d'obtenir ce travail, jusqu'à présent, aucune joie,

Voici ce que j'ai jusqu'à présent...

//**************************
//*** Randomize the list ***
//**************************
if (Session["SearchResultsOrder"] != null)
{
    // save the session as a int list
    List<int> IDList = new List<int>((List<int>)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<Member> RandomList = new List<Member>(SearchData.ReturnedSearchedMembers);
    SearchData.ReturnedSearchedMembers = GloballyAvailableMethods.RandomizeGenericList<Member>(RandomList, RandomList.Count).ToList();

    // save the order of these results so they can be restored back during postback
    List<int> SearchResultsOrder = new List<int>();
    SearchData.ReturnedSearchedMembers.ForEach(x => SearchResultsOrder.Add(x.ID));
    Session["SearchResultsOrder"] = SearchResultsOrder;
}   

Le point entier de ce qui est alors, quand un internaute fait une recherche pour les membres, au départ, ils s'affichent dans un ordre aléatoire, puis s'il clique sur la page 2, ils restent dans l'ordre et les 20 prochaines affichage des résultats.

J'ai lu sur le ICompare je peux l'utiliser comme paramètre dans le Linq.OrderBy clause, mais je ne trouve pas de simples exemples.

Je suis l'espoir d'un élégant, très simple LINQ style de solution, eh bien, je peux toujours espérer.

Toute aide est le plus apprécié

Truegilly

121voto

Simon D. Points 2430

Un autre LINQ-approche:

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

26voto

Jimmy Points 35501

Une façon de le faire:

List<int>  order = ....;
List<Item> items = ....;

Dictionary<int,Item> d = items.ToDictionary(x => x.ID);

List<Item> ordered = order.Select(i => d[i]).ToList();

9voto

nawfal Points 13500

Join est le meilleur candidat si vous voulez correspondre exactement au nombre entier (si aucune correspondance n'est trouvée, vous obtenez une séquence vide). Si vous souhaitez simplement obtenir l'ordre de tri de la liste autres (et à condition que le nombre d'éléments dans les deux listes sont égales), vous pouvez utiliser Zip.

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

Assez lisible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X