views:

70

answers:

2

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

Truegilly

+1  A: 

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();
Jimmy
+2  A: 

Another LINQ-approach:

 var orderedByIDList = from i in ids 
                       join o in objectsWithIDs
                       on i equals o.ID
                       select o;
Simpzon
Awsome, just what i was after, a simple and elegant LINQ solution :), i didnt even know you could join in LINQ, dam its good :)
Truegilly
How performant is this?
Hamish Grubijan
My personal experience is that Linq is in general performing much better than many people think, in most of the cases it's just syntactic sugar executing the same operations as other code in the end, so you will usually not feel the difference.Actually, for this special case I only know it works, I guess if it is not performing well then you will have to chose a completely different data structure, because this full list join will always take some time, no matter how you do it.
Simpzon