Hukmchand
Hukmchand

Reputation: 79

Sorting a SortedDictionary based on value, not key

I have a SortedDictionary, the key is a int value and the matching value to each key is a class object. The class contains a int and a two datetime variable.

I need to sort my SortedDictionary based on the InTime datetime in my class. So that when I do a foreach to loop through my SortedDictionary I will have them sorted based on datetime.

Is this possible? How can I achieve it?

enter code here
 class Busdetail
    {
        public int BusNo { get; set; }
        public DateTime InTime { get; set; }
        public DateTime OutTime { get; set; }
    }

Upvotes: 7

Views: 30699

Answers (4)

Lehonti
Lehonti

Reputation: 133

You could use a Linq query.

var D = new SortedDictionary<int, string>();
var qD = from kvp in D
         orderby kvp.Value
         select kvp
;

Upvotes: 1

user3413823
user3413823

Reputation: 11

I think you can use SortedSet and Tuple of your key and value, like: SortedSet> ((a,b)=>(a.Item2.CompareTo(b.Item2));

Upvotes: 1

Patches
Patches

Reputation: 1125

SortedDictionary can't be sorted by value, though you can extract a sorted list of values, as the other answers point out.

What you want to do is use a list of keyvaluepairs instead, then sort that, like so:

List<KeyValuePair<int, BusDetail>> busses = GetMyListOfBusses();
busses.Sort((first, next) => { 
     return first.Value.InTime.CompareTo(next.Value.Intime); 
});

At that point, your keyvaluepair list of busses will be sorted by InTime

Upvotes: 3

SWeko
SWeko

Reputation: 30882

Sorted Dictionary will always sort on the key, so there is no way to re-arrange it's data so they are sorted on anything other that the key. What you can do is get the data into another structure (some kind of IOrderedEnumerable) where they can be sorted on things other that the key.

If you want to discard the keys and just get the values then

var sortedValues = dictionary.Values.OrderBy(busDetail => busDetail.InTime);

will work, and the type of sortedValues will be IOrderedEnumerable<BusDetail>. If you still need to keep both the keys and values, you could do:

var sortedElements = dictionary.OrderBy(kvp => kvp.Value.InTime);

which will return a IOrderedEnumerable<KeyValuePair<int, BusDetail>>. You can that foreach on any of these two collections, or you could bind them to a grid's datasource.

Upvotes: 12

Related Questions