什么是我可以用来检索最后一个入口位置的最好或更容易的容器?轻松获取最后一个输入位置?
还是没有比使用Count更好或更容易?依靠伯爵可以吗?
例子:
List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);
还有就是这个列表中没有并行写入主要阅读。
什么是我可以用来检索最后一个入口位置的最好或更容易的容器?轻松获取最后一个输入位置?
还是没有比使用Count更好或更容易?依靠伯爵可以吗?
例子:
List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);
还有就是这个列表中没有并行写入主要阅读。
使用Count
是罚款List<T>
- 或任何其他实现ICollection<T>
或ICollection
- 但你必须在你的代码的off-by-one error。它应该是...
int lastEntry = myList.Count - 1; // index is zero-based
如果您只需访问列表中的最后一项,则最好使用Stack<T>
代替。对于你写的代码,使用Count没有问题 - 请记住,你应该使用.Count - 1
你也可以使用Last,它可以帮助你避免像你所做的那样的错误。
附注:Last
针对IList
实现进行了优化,以使用与您所做的完全相同的方法:使用索引进行访问。确定它可能比手动执行(优化需要额外的投射)要慢,但除非它确实是一个瓶颈,否则我不会太担心。
如果你有兴趣来研究这个主题更深刻,这里的乔恩斯基特的优秀系列的一部分:Reimplementing LINQ to Objects: Part 11 - First/Single/Last and the ...OrDefault versions
你可以采取Last()
扩展方法的优点,像这样:
Message.Box(myList.Last().Name);
是的,但会迭代思考整个列表,inst? – Guapo
这取决于'Last'的实现,我不确定。在支持它的集合上使用'Count'可能会很聪明,如果它只实现了'IEnumerable'(这是我实现它的方式),它就会回到枚举类型。 –
@NathanAnderson:这正是它的实现方式 - 它为其他情况使用了“IList”的索引访问和基于常规迭代的方法。 –
使用堆栈:
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;
}
}
不幸的是列表的方法不是虚拟的,所以你必须隐藏起来,因此你必须使用这个类作为具体的SmartList;您不能将其用作List类型变量或参数的值。
是的,我的坏是写在急于和可能会留下一些错过,所以使用计数将是最快的方式,但简单和大多数列表类型可用? – Guapo
@Guapo:实现“ICollection”或“ICollection”的所有内容都具有“Count”属性。 –
LukeH