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使用索引访问,对其他情况使用基于定期迭代的方法。