删除并返回列表的第一项

时间:2015-12-21 15:32:39

标签: c# list

我想知道是否有一个构建方法来删除并使用一个方法/命令返回列表的第一项。

我用过这个,不是很漂亮

Item currentItem = items.First();
items.RemoveAt(0);

所以我可以写一个扩展方法:

public static class ListExtensions
{
    public static T RemoveAndReturnFirst<T>(this List<T> list)
    {
        T currentFirst = list.First();
        list.RemoveAt(0);
        return currentFirst;
    }
 }

//Example code
Item currentItem = items.RemoveAndReturnFirst();

这是最好的可能性还是有内置方法?

该列表是从nHibernate-Query返回的,因此它应该保持为List<T>

2 个答案:

答案 0 :(得分:6)

此操作的最合适的集合是Queue

var queue = new Queue<int>();
queue.Enqueue(10); //add first
queue.Enqueue(20); //add to the end

var first = queue.Dequeue(); //removes first and returns it (10)

队列使EnqueueDequeue操作非常快。但是,如果你需要在队列内搜索,或者按索引获取项目 - 这是一个糟糕的选择。比较一下,您有多少种不同类型的操作,并根据此选择最合适的集合 - 队列,堆栈,列表或简单数组。

您也可以从Queue

创建List
var list = new List<int>();
var queue = new Queue<int>(list);

答案 1 :(得分:3)

没有内置方法。你的代码对我来说很好。

一件小事,我会使用索引器,而不是First扩展方法:

T currentFirst = list[0];

如果有Count > 0,请检查您的列表。

public static T RemoveAndReturnFirst<T>(this List<T> list)
{
    if (list == null || list.Count == 0)
    {
        // Instead of returning the default,
        // an exception might be more compliant to the method signature.

        return default(T);
    }

    T currentFirst = list[0];
    list.RemoveAt(0);
    return currentFirst;
}

如果你不得不担心并发性,我会建议使用另一种集合类型,因为这个不是线程安全的。