kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Adam Kane
Adam Kane
Вопрос

Как получить n-й элемент из словаря?

cipher = new Dictionary<char,int>;
cipher.Add( 'a', 324 );
cipher.Add( 'b', 553 );
cipher.Add( 'c', 915 );

Как получить 2-й элемент? Например, я хотел бы получить что-то вроде:

KeyValuePair pair = cipher[1]

Где пара содержит ( 'b', 553 ).


В соответствии с предложением coop'а использовать List, все работает:

List<KeyValuePair<char, int>> cipher = new List<KeyValuePair<char, int>>();
cipher.Add( new KeyValuePair<char, int>( 'a', 324 ) );
cipher.Add( new KeyValuePair<char, int>( 'b', 553 ) );
cipher.Add( new KeyValuePair<char, int>( 'c', 915 ) );

KeyValuePair<char, int> pair = cipher[ 1 ];

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

34 2009-07-23T16:26:50+00:00 8
 ann
ann
Редактировал вопрос 24-го августа 2015 в 8:06
Программирование
c#
dictionary
Решение / Ответ
 thecoop
thecoop
23-го июля 2009 в 4:28
2009-07-23T16:28:31+00:00
Дополнительно
Источник
Редактировать
#9295819

Проблема в том, что словарь не сортируется. Вам нужен SortedList, который позволяет получать значения по индексу, а также по ключу, хотя для получения нужной сортировки вам, возможно, придется указать в конструкторе собственный компаратор. Затем вы можете получить доступ к упорядоченному списку ключей и значений и использовать различные комбинации методов IndexOfKey/IndexOfValue по мере необходимости.

34
0
 grenade
grenade
23-го июля 2009 в 4:45
2009-07-23T16:45:09+00:00
Дополнительно
Источник
Редактировать
#9295821

вот так:

int n = 0;
int nthValue = cipher[cipher.Keys.ToList()[n]];

обратите внимание, что вам также понадобится ссылка на Linq в верхней части вашей страницы...

using System.Linq;
 grenade
grenade
Редактировал ответ 23-го июля 2009 в 4:53
28
0
Jon Skeet
Jon Skeet
23-го июля 2009 в 4:49
2009-07-23T16:49:07+00:00
Дополнительно
Источник
Редактировать
#9295822

Вы на самом деле нужно искать ключ? Если нет, то использовать список<KeyValuePair<типа char, и int>> (или еще лучше, создать тип инкапсуляции чар и Инт).

Словари не'т отсортированный по сути - словарь реализаций, которые являются отсортированы по .Чистый сортируются по ключу, а не по порядку вставки.

Если вам нужно получить доступ к коллекции как заказать и ключевые вставки, Я'd рекомендую инкапсуляция список и словарь в одном типа коллекции.

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

17
0
Sahil Mukheja
Sahil Mukheja
2-го марта 2017 в 5:14
2017-03-02T05:14:16+00:00
Дополнительно
Источник
Редактировать
#9295825

Вы можете использовать ElementAt ()`, как это:

cipher.ElementAt(index);

Его лучше, чем выберите опцию потому что таким образом вы не'т придется перебрать словарь:

документация

/// <summary>Returns the element at a specified index in a sequence.</summary>
/// <returns>The element at the specified position in the source sequence.</returns>
/// <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1" /> to return an element from.</param>
/// <param name="index">The zero-based index of the element to retrieve.</param>
/// <typeparam name="TSource">The type of the elements of <paramref name="source" />.</typeparam>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="source" /> is null.</exception>
/// <exception cref="T:System.ArgumentOutOfRangeException">
/// <paramref name="index" /> is less than 0 or greater than or equal to the number of elements in <paramref name="source" />.</exception>
Joel Harkes
Joel Harkes
Редактировал ответ 2-го марта 2017 в 7:37
6
0
 vipw
vipw
17-го июня 2011 в 10:57
2011-06-17T10:57:17+00:00
Дополнительно
Источник
Редактировать
#9295823

Был Боян этот вопрос здесь: https://stackoverflow.com/questions/6384528/how-to-retrieve-nth-item-in-dictionary/6384552. Он должен быть закрыт в ближайшее время, но я заметил, что ответы здесь не хватает нового класса OrderedDictionary.

Там сейчас (по состоянию на .Сеть 4), в OrderedDictionary класс. Это позволяет быстро поиска при предоставлении заказа. Пункт(int32) метод возвращает N-й элемент.

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:31
2
0
 Cyberherbalist
Cyberherbalist
23-го июля 2009 в 4:44
2009-07-23T16:44:31+00:00
Дополнительно
Источник
Редактировать
#9295820

Просто, чтобы ухватиться за ваш первоначальный образец для Словаря, я набросал немного кода и придумал:

Dictionary<string, string> d = new Dictionary<string, string>();

d.Add("a", "apple");
d.Add("b", "ball");
d.Add("c", "cat");
d.Add("d", "dog");

int t = 0;
foreach (string s in d.Values)
{
    t++;
    if (t == 2) Console.WriteLine(s);
}

и похоже, что он действительно записывает второй элемент ("мяч") в консоль повторяющимся образом. Если бы вы обернули это в вызов метода для получения n-го элемента, это, вероятно, сработало бы. Однако это довольно некрасиво. Если бы вы могли сделать вместо этого SortedList, как предлагает @thecoop, вам было бы лучше.

2
0
Olioul  Islam Rahi
Olioul Islam Rahi
17-го июня 2015 в 6:01
2015-06-17T06:01:51+00:00
Дополнительно
Источник
Редактировать
#9295824

Можно применить следующий запрос LINQ на ваш 'шифр' словарь

        var cipher = new Dictionary<char, int>();
        cipher.Add('a', 324);
        cipher.Add('b', 553);
        cipher.Add('c', 915);

        var nThValue = cipher.Select((Val, Index) => new { Val, Index })
            .Single(viPair => viPair.Index == 1)   //Selecting dictionary item with it's index using index
            .Val                                   //Extracting KeyValuePair from dictionary item
            .Value;                                //Extracting Value from KeyValuePair
0
0
 tony722
tony722
12-го сентября 2017 в 7:01
2017-09-12T19:01:34+00:00
Дополнительно
Источник
Редактировать
#9295826

Это старый вопрос, но это было полезно для меня. Здесь'с реализация, что я использовал. Я хотел энный элемент должен быть основан на порядке вставки.

public class IndexedDictionary<TKey, TValue> : IEnumerable<TValue> {
  private List<TValue> list = new List<TValue>();
  private Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();

  public TValue this[int index] { get { return list[index]; } }
  public TValue this[TKey key] { get { return dict[key]; } }

  public Dictionary<TKey, TValue>.KeyCollection Keys { get { return dict.Keys; } }

  public int Count { get { return list.Count; } }

  public int IndexOf(TValue item) { return list.IndexOf(item);  }
  public int IndexOfKey(TKey key) { return list.IndexOf(dict[key]); } 

  public void Add(TKey key, TValue value) {
    list.Add(value);
    dict.Add(key, value);
  }

  IEnumerator<TValue> IEnumerable<TValue>.GetEnumerator() {
    return list.GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator() {
    return list.GetEnumerator();
  }
}
 tony722
tony722
Редактировал ответ 12-го сентября 2017 в 7:07
0
0
Похожие сообщества 6
Microsoft Stack Jobs
Microsoft Stack Jobs
2 414 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 330 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 763 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 428 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
293 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
ext
ext
31 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 2 дня назад
2
Денис Васьков
Зарегистрирован 4 дня назад
3
Dima Patrushev
Зарегистрирован 6 дней назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией