Как я могу заказать словарь в C #? - PullRequest
6 голосов
/ 17 января 2010

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

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

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

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

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

Ответы [ 5 ]

11 голосов
/ 17 января 2010

Похоже, у вас есть Dictionary<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();
4 голосов
/ 18 июля 2012

Следующая информация предоставлена ​​в виде: http://www.dotnetperls.com/sort-dictionary

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

Сортировка ключей

Этот пример решает проблему с помощью свойства Keys на Экземпляр словаря, а затем метод расширения ToList и сортировка метод экземпляра.

Сначала создается пример словаря, который заполняется кнопкой Добавить. Способ; затем в ключах используются методы ToList и Sort; наконец, результирующий список проходит через цикл foreach. построить. Также обратите внимание на то, как ключевое слово var implicit typed используется повсеместно, чтобы уменьшить синтаксическую избыточность.

Программа, которая сортирует ключи в словаре [C #]

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
  // Create dictionary and add five keys and values.
  var dictionary = new Dictionary<string, int>();
  dictionary.Add("car", 2);
  dictionary.Add("apple", 1);
  dictionary.Add("zebra", 0);
  dictionary.Add("mouse", 5);
  dictionary.Add("year", 3);

  // Acquire keys and sort them.
  var list = dictionary.Keys.ToList();
  list.Sort();

  // Loop through keys.
  foreach (var key in list)
  {
      Console.WriteLine("{0}: {1}", key, dictionary[key]);
  }
    }
}

выход

apple: 1
car: 2
mouse: 5
year: 3
zebra: 0

Сортировка значений

Далее мы покажем, как сортировать значения в словаре. Мы видим консоль Программа, которую вы можете скомпилировать в Visual Studio и запустить. Это добавляет ключи к Словарь, а затем сортирует их по значениям. Помни что Экземпляры словаря изначально никак не сортируются. Мы используем Ключевое слово LINQ orderby в запросе.

OrderBy Clause Программа, которая сортирует словарь [C #]

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
  // Example dictionary.
  var dictionary = new Dictionary<string, int>(5);
  dictionary.Add("cat", 1);
  dictionary.Add("dog", 0);
  dictionary.Add("mouse", 5);
  dictionary.Add("eel", 3);
  dictionary.Add("programmer", 2);

  // Order by values.
  // ... Use LINQ to specify sorting by value.
  var items = from pair in dictionary
          orderby pair.Value ascending
          select pair;

  // Display results.
  foreach (KeyValuePair<string, int> pair in items)
  {
      Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
  }

  // Reverse sort.
  // ... Can be looped over in the same way as above.
  items = from pair in dictionary
      orderby pair.Value descending
      select pair;
    }
}

выход

dog: 0
cat: 1
programmer: 2
eel: 3
mouse: 5

по убыванию ключевого слова

по убыванию

var items = from pair in dictionary
      orderby pair.Value descending
      select pair;

Пример вывода

mouse: 5
eel: 3
programmer: 2
cat: 1
dog: 0
1 голос
/ 17 января 2010

Используйте расширение GroupBy в IEnumerable (), чтобы сгруппировать числа и извлечь их количество. Это создает словарь из списка и упорядочивает его одним оператором.

var ordered = list.GroupBy( l => l )
                  .OrderByDescending( g => g.Count() )
                  .ToDictionary( g => g.Key, g.Count() );
0 голосов
/ 17 января 2010

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

Сортирует элементы по ключу при вставке. подробнее ..

0 голосов
/ 17 января 2010
    List<KeyValuePair<type, type>> listEquivalent = 
new List<KeyValuePair<type, type>>(dictionary);    

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

Может быть, что-то подобное?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...