2011-10-31 61 views
1

什么是我可以用来检索最后一个入口位置的最好或更容易的容器?轻松获取最后一个输入位置?

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

例子:

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

还有就是这个列表中没有并行写入主要阅读。

回答

2

使用Count是罚款List<T> - 或任何其他实现ICollection<T>ICollection - 但你必须在你的代码的off-by-one error。它应该是...

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

是的,我的坏是写在急于和可能会留下一些错过,所以使用计数将是最快的方式,但简单和大多数列表类型可用? – Guapo

+0

@Guapo:实现“ICollection ”或“ICollection”的所有内容都具有“Count”属性。 – LukeH

2

计数将是最高效的,但因为列表索引是从零开始的,你会想用count - 1检索列表中的最后一项。

如果你真的想你可以使用LINQ和做类似:

myList.Last() 

,或者,如果你担心空列表

myList.LastOrDefault() 

但是,这将会很可能会比较慢(视如何实现Last())

+0

可能值得添加.LastOrDefault()来考虑0长度的列表。 – deepee1

+0

谢谢....当我开始回答问题时想到了这个问题。生活与ADD :) – ckramer

0

如果您只需访问列表中的最后一项,则最好使用Stack<T>代替。对于你写的代码,使用Count没有问题 - 请记住,你应该使用.Count - 1

1

你也可以使用Last,它可以帮助你避免像你所做的那样的错误。

附注:Last针对IList实现进行了优化,以使用与您所做的完全相同的方法:使用索引进行访问。确定它可能比手动执行(优化需要额外的投射)要慢,但除非它确实是一个瓶颈,否则我不会太担心。

如果你有兴趣来研究这个主题更深刻,这里的乔恩斯基特的优秀系列的一部分:Reimplementing LINQ to Objects: Part 11 - First/Single/Last and the ...OrDefault versions

1

你可以采取Last()扩展方法的优点,像这样:

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

是的,但会迭代思考整个列表,inst? – Guapo

+1

这取决于'Last'的实现,我不确定。在支持它的集合上使用'Count'可能会很聪明,如果它只实现了'IEnumerable'(这是我实现它的方式),它就会回到枚举类型。 –

+0

@NathanAnderson:这正是它的实现方式 - 它为其他情况使用了“IList”的索引访问和基于常规迭代的方法。 –

0

使用堆栈:

Stack<Class> d = new Stack<Class>(); 
Class last = d.Pop(); 
Message.Box(last.Name); 

,或者如果你不想删除:

Class last = d.Peek(); 
    Message.Box(last.Name); 
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; 
    } 
} 

不幸的是列表的方法不是虚拟的,所以你必须隐藏起来,因此你必须使用这个类作为具体的SmartList;您不能将其用作List类型变量或参数的值。