I have 2 list objects, one is just a list of ints, the other is a list of objects but the objects has an ID property.
What i want to do is sort the list of objects by its ID in the same sort order as the list of ints.
Ive been playing around for a while now trying to get it working, so far no joy,
Here is what i have so far...
//************************** //*** 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; }
The whole point of this is so when a user searches for members, initially they display in a random order, then if they click page 2, they remain in that order and the next 20 results display.
I have been reading about the ICompare i can use as a parameter in the Linq.OrderBy clause, but i can’t find any simple examples.
I’m hoping for an elegant, very simple LINQ style solution, well I can always hope.
Any help is most appreciated.
Approach : Zip the two lists. Create a new, sorted list based on the zip using sorted(). Using a list comprehension extract the first elements of each pair from the sorted, zipped list.
Another LINQ-approach:
var orderedByIDList = from i in ids join o in objectsWithIDs on i equals o.ID select o;
One way of doing it:
List<int> order = ....; List<Item> items = ....; Dictionary<int,Item> d = items.ToDictionary(x => x.ID); List<Item> ordered = order.Select(i => d[i]).ToList();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With