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

时间:2011-06-02 14:48:21

标签: c# linq dictionary

鉴于代码..

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;

但这不起作用......

8 个答案:

答案 0 :(得分:8)

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

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

同样,IAbstract是正确的,您可能需要使用OrderedDictionary。

答案 1 :(得分:2)

您需要使用OrderedDictionary<TKey, TValue>。查看MSDN ref.

使用标准词典,不保证项目以任何特定顺序保留。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在循环外的最后一项上执行操作会不简单吗?

string requiredForSomething = dictionary.Last().Value;

答案 4 :(得分:1)

您可以随时使用计数器执行此操作。

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
  }

}

答案 5 :(得分:1)

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

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

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

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

其次,Last扩展方法将痛苦地缓慢,因为它必须枚举整个集合。

第三,我不确定在具有不可预测的顺序的集合中对最后一项做一些特别的事情是很有意义的,但这与你的具体问题大致相同。

以下是我如何处理这个问题。创建两个在IEnumerable<T>个实例上运行的新扩展方法。 ForEach将等同于List<T>.ForEach方法,WithIndex将返回包含顺序索引和IsLast标志的另一个枚举数。这是another one of my answers对类似问题的变体。

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