我可以用来检索最后一个入口位置的最佳或更容易的容器是什么?
或者使用Count没有更好或更容易?依靠伯爵可以吗?
示例:
List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);
此列表没有并发写入主要是读取。
答案 0 :(得分:2)
使用Count
适用于List<T>
- 或其他任何实施ICollection<T>
或ICollection
的内容 - 但您的代码中有off-by-one error。它应该是......
int lastEntry = myList.Count - 1; // index is zero-based
答案 1 :(得分:2)
Count将是性能最高的,但由于列表索引从零开始,因此您需要使用count - 1
来检索列表中的最后一个条目。
如果你真的想要你可以使用Linq并做类似的事情:
myList.Last()
或者,如果您担心空列表
myList.LastOrDefault()
但这很可能会更慢(取决于Last()的实施方式)
答案 2 :(得分:1)
你也可以使用Last,它可以帮助你避免像你所做的错误。
在旁注:Last
针对IList
实现进行了优化,使用与您完全相同的方法:使用索引访问。当然它可能比手动操作要慢(优化需要额外的演员),但除非它真的是瓶颈,否则我不会太担心。
如果你有兴趣深入研究这个话题,这里是Jon Skeet优秀系列的一部分:Reimplementing LINQ to Objects: Part 11 - First/Single/Last and the ...OrDefault versions
答案 3 :(得分:1)
你可以利用Last()
扩展方法,如下所示:
Message.Box(myList.Last().Name);
答案 4 :(得分:0)
如果您只需要访问列表中的最后一项,则最好使用Stack<T>
。对于您编写的代码,使用Count没有任何问题 - 请记住您应该使用.Count - 1
答案 5 :(得分:0)
使用堆栈:
Stack<Class> d = new Stack<Class>();
Class last = d.Pop();
Message.Box(last.Name);
或者如果您不想删除:
Class last = d.Peek();
Message.Box(last.Name);
答案 6 :(得分:0)
我想提出一个似乎已被掩盖的观点。列表不是队列;你并不总是添加到最后。您可以改为插入它们。如果你想要最后插入项目的索引,你必须更有创意:
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;您不能将它用作List类型变量或参数的值。