Как я могу заказать Словарь в C#?

править: Спасибо Jason, то, что это был словарь, не настолько важно. Я просто хотел, чтобы время выполнения имело низкое время выполнения. Это - метод LINQ быстро? Кроме того, я знаю, что это вне темы, но что делает n => n средний?

У меня есть список чисел, и я хочу составить другой список с числами, которые появляются больше всего вначале и наименьшее в конце.

Таким образом, то, что я сделал, было, когда через список и проверил, был ли номер x в словаре. Если это не было затем, я сделал ключ x и значение один. Если это было затем, я изменил значение, чтобы быть значением плюс одно.

Теперь я хочу заказать словарь так, чтобы я мог составить список с теми, которые появляются больше всего вначале и наименьшее в конце.

Как я могу сделать это в C#? время выполнения PS очень важно.

6
задан Daniel 17 January 2010 в 18:36
поделиться

4 ответа

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

// dict is Dictionary<int, int>
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList();

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

// list is IEnumerable<int> (e.g., List<int>)
var ordered = list.GroupBy(n => n)
                  .OrderByDescending(g => g.Count())
                  .Select(g => g.Key)
                  .ToList();

или в синтаксисе запроса

var ordered = (from n in list
               group n by n into g
               orderby g.Count() descending
               select g.Key).ToList();

Теперь, если вам нужно иметь промежуточный словарь, вы можете сказать

var dict = list.GroupBy(n => n)
               .ToDictionary(g => g.Key, g => g.Count());
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList();
11
ответ дан 8 December 2019 в 14:43
поделиться

Звучит так, будто у вас есть словарь < int, int > , где ключ представляет некоторое целое число, которое вы имеете в списке, и соответствующее значение представляет число раз, когда это целое число появилось. Вы говорите, что хотите упорядочить ключи по счетчикам, отсортированным в порядке убывания по частоте. Теперь вы можете сказать

// dict is Dictionary<int, int>
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList();

Теперь это звучит так, как будто вы начали с List < int > , которые являются значениями, которые вы хотите считать и упорядочить по количеству. Вы можете сделать это очень быстро в LINQ так:

// list is IEnumerable<int> (e.g., List<int>)
var ordered = list.GroupBy(n => n)
                  .OrderByDescending(g => g.Count())
                  .Select(g => g.Key)
                  .ToList();

Или в синтаксисе запроса

var ordered = (from n in list
               group n by n into g
               orderby g.Count() descending
               select g.Key).ToList();

Теперь, если вам нужно иметь промежуточный словарь вы можете сказать

var dict = list.GroupBy(n => n)
               .ToDictionary(g => g.Key, g => g.Count());
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList();
-121--4180391-

Вот пример, где подпроцесс получает мой вход:

import subprocess
import sys

command = 'python -c \'print raw_input("Please make a selection: ")\''
sp = subprocess.Popen(command, shell = True, stdin = sys.stdin)
sp.wait()
-121--4998474-

При этом словарь создается из списка и упорядочивается в одной инструкции.

var ordered = list.GroupBy( l => l )
                  .OrderByDescending( g => g.Count() )
                  .ToDictionary( g => g.Key, g.Count() );
1
ответ дан 8 December 2019 в 14:43
поделиться

Вы также можете рассмотреть возможность использования SortedDictionary.

Он сортирует пункты на основе ключа при вставке. больше...

0
ответ дан 8 December 2019 в 14:43
поделиться
    List<KeyValuePair<type, type>> listEquivalent = 
new List<KeyValuePair<type, type>>(dictionary);    

    listEquivalent.Sort((first,second) =>
            {
                return first.Value.CompareTo(second.Value);
            });

что-то вроде этого, может быть?

Редактировать: Спасибо Джейсон за уведомление о моем запуске

0
ответ дан 8 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: