轻松获得最后的入职位置?

时间:2011-10-31 16:17:31

标签: c# list .net-4.0

我可以用来检索最后一个入口位置的最佳或更容易的容器是什么?

或者使用Count没有更好或更容易?依靠伯爵可以吗?

示例:

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

此列表没有并发写入主要是读取。

7 个答案:

答案 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类型变量或参数的值。