Получить последний элемент в словаре?

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

22
задан nawfal 11 June 2014 в 11:25
поделиться

9 ответов

Что вы имеете в виду под словом «Последний»? Вы имеете в виду последнюю добавленную стоимость?

Класс Dictionary представляет собой неупорядоченную коллекцию. Добавление и удаление элементов может изменить то, что считается первым и последним элементом. Следовательно, нет возможности добавить последний элемент.

Существует класс упорядоченного словаря, доступный в форме SortedDictionary . Но это будет упорядочено на основе сравнения ключей, а не порядка, в котором были добавлены значения.

РЕДАКТИРОВАТЬ

Несколько человек упомянули использование следующего подхода в стиле LINQ.

var last = dictionary.Values.Last();

Будьте очень осторожны при использовании этого метода. Он вернет последнее значение в коллекции Values. Это может быть или не быть последним значением, которое вы добавили в Словарь. Вероятно, это не так, как должно быть.

51
ответ дан 29 November 2019 в 03:23
поделиться

Если вы используете .NET 3.5, посмотрите:

 dic.Keys.Last()

Если вам нужен предсказуемый порядок, используйте:

IDictionary<int, string> dic = new SortedDictionary<int, string>();
5
ответ дан 29 November 2019 в 03:23
поделиться

Словари являются неупорядоченными коллекциями - как таковые понятия первого или последнего элемента отсутствуют. Если вы ищете класс, который ведет себя как словарь, но поддерживает порядок вставки элементов, рассмотрите возможность использования OrderedDictionary .

Если вы ищете коллекцию, которая сортирует элементы, рассмотрите возможность использования SortedDictionary .

Если у вас есть существующий словарь, и вы ищете «последний» элемент с заданным порядком сортировки, вы можете использовать linq для сортировки коллекции, например:

myDictionary.Values.OrderBy( x => x.Key ).Last();

С осторожностью используйте Dictionary.Keys .

21
ответ дан 29 November 2019 в 03:23
поделиться

Рассмотрите возможность создания настраиваемой коллекции, содержащей ссылку в методе Добавить настраиваемой коллекции. Это установит закрытое поле, содержащее последний добавленный ключ / значение (или оба) в зависимости от ваших требований.

Затем используйте метод Last () , который возвращает это. Вот доказательство концепции класса, чтобы показать, что я имею в виду (пожалуйста, не обращайте внимания на отсутствие реализации интерфейса и т. Д. - это пример кода):

public class LastDictionary<TKey, TValue>
{
    private Dictionary<TKey, TValue> dict;

    public LastDictionary()
    {
        dict = new Dictionary<TKey, TValue>();
    }

    public void Add(TKey key, TValue value)
    {
        LastKey = key;
        LastValue = value;
        dict.Add(key, value);
    }

    public TKey LastKey
    {
        get; private set;
    }

    public TValue LastValue
    {
        get; private set;
    }
}
3
ответ дан 29 November 2019 в 03:23
поделиться

Если вам просто нужно значение, это должно сработать (при условии, что вы можете использовать LINQ):

dic.Values.Last()
0
ответ дан 29 November 2019 в 03:23
поделиться

Из документов :

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

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

Используйте другую коллекцию. Может быть SortedDictionary ...

1
ответ дан 29 November 2019 в 03:23
поделиться

Вы можете использовать:

dic.Last()

Но в словаре действительно нет последнего элемента ( пары внутри не упорядочены каким-либо образом). Последний элемент всегда будет одним и тем же, но не очевидно, какой это может быть элемент.

0
ответ дан 29 November 2019 в 03:23
поделиться

Словарь не предназначен для доступа по порядку, поэтому первое, последнее не имеют значения. Вы хотите, чтобы значение было проиндексировано наивысшим ключом?

Dictionary<double, string> dic = new Dictionary<double, string>();
double highest = double.MinValue;
string result = null;
foreach(double d in dic.keys)
{
   if(d > highest)
   {
      result = dic[d];
      highest = d;
   }
}
0
ответ дан 29 November 2019 в 03:23
поделиться

С .Net 3.5:

string lastItem = dic.Values.Last()
string lastKey = dic.Keys.Last()

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

0
ответ дан 29 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

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