轻松进入最后一个位置

本文关键字:最后一个 位置 | 更新日期: 2023-09-27 18:12:58

我可以用来检索最后条目位置的最佳或更简单的容器是什么?

或者没有比Count更好或更简单的方法了?count可以吗?

的例子:

List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);

没有并发写,主要读

轻松进入最后一个位置

对于List<T>使用Count是可以的——或者任何其他实现ICollection<T>ICollection的东西——但是您的代码中有一个偏离1的错误。应该是……

int lastEntry = myList.Count - 1;    // index is zero-based

Count将是最高效的,尽管由于列表索引是从零开始的,您将希望使用count - 1来检索列表中的最后一个条目。

如果你真的需要的话,你可以使用Linq做一些类似的事情:

myList.Last()

或者,如果您担心空列表

myList.LastOrDefault()

但是这很可能会更慢(取决于Last()是如何实现的)

您可以这样利用Last()扩展方法:

Message.Box(myList.Last().Name);

您还可以使用Last,它可以帮助您避免犯类似的错误。

旁注:Last针对IList实现进行了优化,使用与您所做的完全相同的方法:使用索引访问。当然,这可能比手动操作要慢(优化需要额外的强制转换),但除非它真的是一个瓶颈,否则我不会担心太多。

如果你有兴趣深入研究这个话题,这里是Jon Skeet优秀系列的一部分:重新实现LINQ到对象:第11部分-第一/单一/最后和…OrDefault版本

如果您只需要访问列表中的最后一项,那么使用Stack<T>可能会更好。对于您编写的代码,使用Count没有任何问题-记住您应该使用.Count - 1

使用堆栈:

Stack<Class> d = new Stack<Class>();
Class last = d.Pop();
Message.Box(last.Name);

或者如果你不想删除:

  Class last = d.Peek();
    Message.Box(last.Name);

我想说明一点,这一点似乎被忽略了。列表不是队列;你不总是在最后加。相反,您可以向它们插入。如果您想要最后插入项的索引,您必须更有创意一点:

public class SmartList<T>:List<T>
{
   public int LastIndex {get; protected set;}   
   public new virtual void Add(T obj)
   {
      base.Add(obj);
      lastIndex = Count - 1;
   }
   public new virtual void AddRange(IEnumerable<T> obj)
   {
      base.AddRange(obj);
      lastIndex = Count - 1;
   }
   public new virtual void Insert(T obj, int index)
   {
      base.Insert(obj, index);
      lastIndex = index;
   }
}

不幸的是,List的方法不是虚拟的,所以你必须隐藏它们,因此你必须使用这个类作为具体的SmartList;不能将其用作列表类型的变量或参数的值。