轻松进入最后一个位置
本文关键字:最后一个 位置 | 更新日期: 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;不能将其用作列表类型的变量或参数的值。