I have two generic list objects, in which one contains ids and ordering, and the other a bunch of ids with each id in the second list having an id reference to the first list, for example;
public class OptionType { public int ID { get; set; } public int Ordering { get; set; } } public class Option { public int ID { get; set; } public int Type_ID { get; set; } }
Obviously I can do a simple sort on a list of OptionTypes by doing
types_list.OrderBy(x => x.Ordering);
Question is though, how could I go about ordering an 'options_list' by utilising the 'Type_ID' on the object which would relate to the ordering of the types_list. As in something like (obviously this isn't valid - but hopefully you will get the idea!)
options_list.OrderBy(x => x.Type_ID == types_list.OrderBy(e => e.Ordering));
Explained: zip the two list s. 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 .
You should be able to use a join to produce your desired output. Example using query syntax.
var orderedOptions = from option in options_list join type in types_list on option.Type_ID equals type.ID orderby type.Ordering select option;
List.FindIndex() is your friend when your working with small lists:
var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id));
Working example: https://dotnetfiddle.net/CpLeFU
As @goodeye pointed out in the comments, performance will be a nightmare on larger lists. Use the accepted answer in that case.
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