править: Спасибо Jason, то, что это был словарь, не настолько важно. Я просто хотел, чтобы время выполнения имело низкое время выполнения. Это - метод LINQ быстро? Кроме того, я знаю, что это вне темы, но что делает n => n средний?
У меня есть список чисел, и я хочу составить другой список с числами, которые появляются больше всего вначале и наименьшее в конце.
Таким образом, то, что я сделал, было, когда через список и проверил, был ли номер x в словаре. Если это не было затем, я сделал ключ x и значение один. Если это было затем, я изменил значение, чтобы быть значением плюс одно.
Теперь я хочу заказать словарь так, чтобы я мог составить список с теми, которые появляются больше всего вначале и наименьшее в конце.
Как я могу сделать это в C#? время выполнения PS очень важно.
Так что звучит как у вас есть словарь
, где ключ представляет собой некоторое целое число, которое у вас есть в списке, и соответствующее значение представляет количество появившихся количества раз, которые появились целое число. Вы говорите, что хотите заказать клавиши по количеству отсортированы в порядке убывания по частоте. Тогда вы можете сказать
// 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();
Звучит так, будто у вас есть словарь < 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() );
Вы также можете рассмотреть возможность использования SortedDictionary.
Он сортирует пункты на основе ключа при вставке. больше...
List<KeyValuePair<type, type>> listEquivalent =
new List<KeyValuePair<type, type>>(dictionary);
listEquivalent.Sort((first,second) =>
{
return first.Value.CompareTo(second.Value);
});
что-то вроде этого, может быть?
Редактировать: Спасибо Джейсон за уведомление о моем запуске