C# 轻松获得最后一个进入位置?

C# 轻松获得最后一个进入位置?,c#,list,.net-4.0,C#,List,.net 4.0,我可以使用什么样的容器来检索最后一个入口位置 或者没有比使用计数更好或更简单的方法了?依靠计数可以吗 例如: List<Class> myList = new List<Class>(); int lastEntry = myList.Count - 1; Message.Box(myList[lastEntry].Name); 没有并发写入此列表,主要是读取。使用或任何其他实现或的方法都可以,但代码中有一个。应该是 int lastEntry = myList.Cou

我可以使用什么样的容器来检索最后一个入口位置

或者没有比使用计数更好或更简单的方法了?依靠计数可以吗

例如:

List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);
没有并发写入此列表,主要是读取。

使用或任何其他实现或的方法都可以,但代码中有一个。应该是

int lastEntry = myList.Count - 1;    // index is zero-based
使用或任何其他实现或的方法都可以,但是您的代码中有一个。应该是

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

Count将是性能最好的,不过由于列表索引是基于零的,所以您需要使用Count-1来检索列表中的最后一个条目

如果您确实需要,可以使用Linq并执行以下操作:

myList.Last()
或者,如果你担心空名单

myList.LastOrDefault()

但是这很可能会慢一些,这取决于最后一个的实现方式。

计数将是最有效的,尽管由于列表索引是基于零的,所以您需要使用计数-1来检索列表中的最后一个条目

如果您确实需要,可以使用Linq并执行以下操作:

myList.Last()
或者,如果你担心空名单

myList.LastOrDefault()

但是这很可能会慢一些,这取决于Last的实现方式

如果您只需要访问列表中的最后一项,那么最好使用堆栈。对于您编写的代码,使用Count没有什么错-请记住您应该使用.Count-1

如果您只需要访问列表中的最后一项,那么最好使用堆栈。对于您编写的代码,使用Count没有什么错-请记住您应该使用。Count-1也可以使用,它可以帮助您避免像您所犯的错误

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

如果您有兴趣更深入地研究这个主题,这里是Jon Skeet优秀系列的一部分:

您也可以使用,它可以帮助您避免像您所犯的错误

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


如果您有兴趣更深入地研究这个主题,下面是Jon Skeet优秀系列的一部分:

您可以利用最后一种扩展方法,如下所示:

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

您可以利用最后一种扩展方法,如下所示:

Message.Box(myList.Last().Name);
使用堆栈:

Stack<Class> d = new Stack<Class>();
Class last = d.Pop();
Message.Box(last.Name);
使用堆栈:

Stack<Class> d = new Stack<Class>();
Class last = d.Pop();
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;不能将其用作列表类型变量或参数的值。

我想指出一点,这一点似乎已经被忽略了。列表不是队列;你并不总是在结尾加上。您可以改为插入到它们。如果您想要最后一个插入项的索引,您必须更具创造性:

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;您不能将其用作列表类型变量或参数的值。

是的,我的坏消息是在匆忙中写入的,可能会留下一些遗漏,所以使用count是最快的方法,但对大多数列表类型来说简单且可用?@Guapo:实现ICollection或ICollection的所有东西都有count属性。是的,我的坏习惯是匆忙编写,可能会留下一些遗漏,因此,使用计数是最快的方式,但对于大多数列表类型来说是最简单和可用的?@ GAPPO:实现ICLIONION或ICOLSECT的所有东西都有一个计数属性。完成了。LoStReStudio可以考虑0个长度列表。谢谢……当我开始回答这个问题时想到了……我完成的时候把它忘了。生活与添加:是的,但这将迭代整个列表,不是吗?这取决于最后的实现,我不确定。对支持它的集合使用Count可能足够聪明,如果它只实现IEnumerable,则返回枚举,这是我实现它的方式。@NathanAnderson:这正是它的实现方式-它对IList和常规迭代基使用索引访问
是的,但这会迭代整个列表,不是吗?这取决于Last的实现,我不确定。对支持它的集合使用Count可能足够聪明,如果它只实现IEnumerable,则返回枚举,这是我实现它的方式。@NathanAnderson:这正是它的实现方式-它对IList使用索引访问,对其他情况使用基于定期迭代的方法。