查看字典项是否是字典中的最后一个

本文关键字:字典 最后一个 是否是 | 更新日期: 2023-09-27 17:58:10

给定代码。。

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;

但那没用。。。

查看字典项是否是字典中的最后一个

Dictionary.Last返回一个KeyValuePair,您将其与键的值进行比较。相反,你需要检查:

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

此外,IAbstract是正确的,您可能需要使用有序字典。

您将需要使用OrderedDictionary<TKey, TValue>。查看MSDN参考

使用标准Dictionary,不能保证项以任何特定顺序持久化。

您可以测试value==dictionary。Values.Last();

只对循环外的最后一项执行操作不是更简单吗?

string requiredForSomething = dictionary.Last().Value;

您总是可以使用计数器来完成此操作。

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
  }
}

有些人提到要将迭代中当前项的与上一项的值进行比较,例如:

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

警告:如果字典中的任何项的值等于字典中最后一个项的值,则这可能导致该项为true。这并不是该项是字典中最后一个项的指示符


相反,如果你真的想知道迭代中的当前项目是否是最后一个项目,我建议你比较密钥,因为你知道它是唯一的,所以它可能看起来像:

    item.Key.Equals(dictionary.Last().Key)

使用System.Linq命名空间,我们可以MyDictionary[item.Key].Equals( MyDictionary.Last().Key );Last()方法应该向我们显示每个数组、字典、列表、堆栈和队列中的最后一个元素

首先,Dictionary甚至IEnumerable都没有ForEach扩展方法。所以你必须先解决这个问题。

其次,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;
        }
    }
}