2015-05-17 5 views
-1

кажется мне хорошо, но мой список по-прежнему не упорядочен по моему ключу.LINQ OrderBy не работает над ключом словаря

var tagNamesAndRoutes = new Dictionary<string, string>(); 

    foreach (string name in tagNames) 
    { 
     tagNamesAndRoutes.Add(name, routeConstant); 
    } 

Пример значений словаря:

Key  Value 
"NUnit"  "/Category" 
"WCF"  "/Category" 
"ReSharper" "/Category" 

и так далее.

Я пытался уладить это с помощью типичной LINQ:

tagNamesAndRoutes.OrderBy(c => c.Key); 

, но это не отсортировано по факту.

+0

Пробовали ли вы SortedDictionary ? – Tzu

+0

Вы использовали возвращаемое значение? OrderBy не имеет побочного эффекта. например var sortedTagNamesAndRoutes = tagNamesAndRoutes.OrderBy (c => c.Key); – user2588666

+0

Протестировал ваш код, и он работает нормально. Вам нужно использовать то, что 'OrderBy' возвращает. Он не вносит изменений в оригинальный словарь. –

ответ

4

OrderBy фактически возвращает вам заказанную коллекцию. Попробуйте следующее:

var orderedTagNamesAndRoutes = tagNamesAndRoutes.OrderBy(c => c.Key); 

Тогда используйте orderedTagNamesAndRoutes.

Если вы хотите, чтобы ваш словарь был отсортирован сам, вы можете использовать SortedDictionary. Try:

var tagNamesAndRoutes = new SortedDictionary<string, string>(); 

Вам не нужно звонить OrderBy в этом случае. Словарь всегда сортируется по ключу.

+0

crap забыл об этом ... спасибо – PositiveGuy

+0

первый изменяет его на Enumerable, поэтому мне придется отбросить его обратно в словарь ... Я бы предпочел предотвратить приведение, так что, вероятно, лучше второй, если никто не знает о каких-либо проблемах с производительностью в SortedDictionary..but предотвращает литье гораздо более результативна. – PositiveGuy

+1

@WeDoTDD - Вы не будете делать «бросок», чтобы вернуть его. Вам нужно будет создать новый словарь из упорядоченного перечислимого. – Enigmativity

3

OrderBy возвращает IOrderedEnumerable который вы можете перебирать в отсортированном порядке и не изменяет фактический словарь.

Так что вам нужно сделать что-то вроде

var sorted = tagNamesAndRoutes.OrderBy(c => c.Key); 
foreach (string name in sorted) { 
    ... 
} 

типа словаря сами по себе не имеет никакого понятия порядка для его ключей. Вы можете использовать SortedDictionary, если вы всегда хотите сортировать ключи.

https://msdn.microsoft.com/en-us/library/vstudio/bb534966%28v=vs.100%29.aspx

+0

да, я думаю, я не получаю OrderBy, затем все еще – PositiveGuy

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