Посмотрите, является ли элемент словаря последним в словаре - PullRequest
4 голосов
/ 02 июня 2011

Учитывая код ..

var dictionary = new Dictionary<string, string>{
  { "something", "something-else" },
  { "another", "another-something-else" }
};

dictionary.ForEach( item => {
  bool isLast = // ... ? 

  // do something if this is the last item
});

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

bool isLast = dictionary[ item.Key ].Equals( dictionary.Last() ) ? true : false;

, но это не сработало ...

Ответы [ 7 ]

8 голосов
/ 02 июня 2011

Dictionary.Last возвращает KeyValuePair, и вы сравниваете это только со значением ключа.Вместо этого вам нужно проверить:

dictionary[item.Key].Equals( dictionary.Last().Value )

Также IAbstract было правильно, что вам, вероятно, нужно использовать OrderedDictionary.

2 голосов
/ 02 июня 2011

Вы захотите использовать OrderedDictionary<TKey, TValue>.Отметьте MSDN ref.

При использовании стандартного словаря не гарантируется сохранение элементов в каком-либо определенном порядке.

1 голос
/ 27 мая 2016

Некоторые люди упоминали, что сравнивают значение текущего элемента в итерации со значением последнего элемента, например:

    dictionary[item.Key].Equals(dictionary.Last().Value) 

Предупреждение. Это может привести к значению true для любого элемента в словаре, если значение элемента равно значению последнего элемента в словаре. Это не показатель того, что элемент является последним в словаре.


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

    item.Key.Equals(dictionary.Last().Key)
1 голос
/ 28 февраля 2012

Вы всегда можете сделать это со счетчиком.

int itemsCount = yourDictionary.Count;
bool isLast = false;

foreach(var item in yourDictionary)
{
   itemsCount--;       
   isLast = itemsCount == 0; 

   if(isLast)
   {
     // this is the last item no matter the order of the dictionary        
   }
   else
  {
    //not the last item
  }

}
1 голос
/ 02 июня 2011

Не проще ли выполнить операцию с последним элементом вне цикла?

string requiredForSomething = dictionary.Last().Value;
1 голос
/ 02 июня 2011

Вы можете проверить, если значение == dictionary.Values.Last ();

0 голосов
/ 02 июня 2011

Во-первых, нет способа расширения ForEach для Dictionary или даже IEnumerable.Так что вам придется сначала решить эту проблему.

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

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

Вот как я бы подошел к проблеме.Создайте два новых метода расширений, которые работают с IEnumerable<T> экземплярами.ForEach будет эквивалентен методу List<T>.ForEach, а WithIndex вернет другой перечислитель, который содержит последовательный индекс и флаг IsLast.Это вариант другого моего ответа на похожую проблему.

dictionary.WithIndex().ForEach(
  (item) =>
  {
    var kvp = item.Value; // This extracts the KeyValuePair
    if (item.IsLast)
    {
      Console.WriteLine("Key=" + kvp.Key.ToString() + "; Value=" + kvp.Value.ToString());
    }
  });

Вот новые методы расширения.

public static class ForEachHelperExtensions
{
    public sealed class Item<T>
    {
        public int Index { get; set; }
        public T Value { get; set; }
        public bool IsLast { get; set; }
    }

    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach (T item in enumerable)
        {
            action(item);
        }
    }

    public static IEnumerable<Item<T>> WithIndex<T>(this IEnumerable<T> enumerable)
    {
        Item<T> item = null;
        foreach (T value in enumerable)
        {
            Item<T> next = new Item<T>();
            next.Index = 0;
            next.Value = value;
            next.IsLast = false;
            if (item != null)
            {
                next.Index = item.Index + 1;
                yield return item;
            }
            item = next;
        }
        if (item != null)
        {
            item.IsLast = true;
            yield return item;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...