2016-02-08 7 views
0

У меня есть два словаря:Заказать Словарь от ключей из другого словаря

Dictionary<string, Tuple<T, T>> dict1 
Dictionary<Enum, Tuple<string, DateTime, DateTime>> dict2 

Значение строки в первом элементе в кортеже иногда равен ключ в первом словаре. Я хотел бы отсортировать второй словарь по значению перечисления, а затем отсортировать первый словарь на основе порядка, который имеет dict2. Как я смогу это сделать, сохранив другие ключи, которые могут быть в dict1? Я могу дойти до сортировки словаря.

var positions = new Dictionary<Enum, string>(); 
//This foreach loop can be simplified by a linq expression. 
        foreach (var position in dict2) 
        { 
         var isFound = dict1.Any(x => x.Key == position.Value.Item1.Value); 

         if (isFound) 
         { 
          clubPositions.Add(position.Key, position.Value.Item1.Value); 
         } 
        } 

        var sortedPositions = positions.OrderByDescending(x => x.Key); 
+2

Вам нужно отсортировать словарь самостоятельно или достаточно, чтобы сортировать элементы из словаря, когда вам нужно их перебирать? – Rawling

ответ

2

Как я понимаю, вопрос заключается не в том, чтобы сортировать первый словарь, но иметь возможность повторять его элементы в порядке, определяемом вторыми клавишами словаря. Если это верно, то следующий должен сделать трюк:

var orderedKeys = new HashSet<string>(dict2.OrderBy(e => e.Key).Select(e => e.Value.Item1)); 
var orderedEntries = orderedKeys.Where(dict1.ContainsKey) 
    .Select(key => new KeyValuePair<string, Tuple<T, T>>(key, dict1[key])) 
    .Concat(dict1.Where(e => !orderedKeys.Contains(e.Key))); 

Обратите внимание, что он поместит запись, которая не имеет соответствующую клавишу последнюю в порядке.

1

Вы не можете сортировать словарь, так как он использует алгоритм хеша для постоянного поиска.

1

Обычный словарь не может быть отсортирован. Вы можете использовать SortedDictionary, он существует для этой цели.

4

Вы ищете SortedDictionary, зарегистрированный на MSDN here. Вам нужно будет создать экземпляр их таким образом:

var dict1 = new SortedDictionary<string, Tuple<DateTime, DateTime>>(); 
var dict2 = new SortedDictionary<Enum, Tuple<string, DateTime, DateTime>>(); 

После того как вы экземпляры отсортированных словарей вы можете использовать LINQ для отображения или фильтр или делать все остальное желательно на них. Когда элементы добавляются в словари, они автоматически сортируются на основе либо ICompare<T> для данного TKey (или по умолчанию IComparer, если явно не предусмотрено).

Одним из недостатков является тот факт, что этот вид основан только на ключе, нет концепции сортировки, основанной на значениях.

+0

Но как работает отображение в LINQ? Если я попробую что-то вроде dict1.OrderBy (x => x.Key == dict2.First (y => y.Value.Item1 == x.Key)), который потерпит неудачу в первом случае, где это не так, правильно? – uioporqwerty

+0

Правильно! Возможно, я неправильно понял ваш вопрос ... похоже, что @Ivan находится на правильном пути, основываясь на его объяснении вашего вопроса. –

Смежные вопросы