如何"出队"列表中的元素?

时间:2014-07-20 23:28:16

标签: c# arrays

我有一张名为_deck的卡片列表:

 private List<String> _deck = new List<String> {"2h", "3h", "4h", ... }

然后我想从列表中删除一张卡并保存到变量中。我正在尝试:

 String p1FirstCard = _deck.RemoveAt(0);

但是我收到错误“无法将类型void转换为String”。

在C#List中有类似push / pop的东西但是在List的“head”或“start”处执行了吗? (推/弹工作在列表的“尾部”或“结尾”。)

如果没有,我应该如何删除第一个元素但将其保存在变量中?

5 个答案:

答案 0 :(得分:40)

你能简单地使用c#已经拥有的Queue class吗?

class Program
{
    static void Main(string[] args)
    {
        var _deck = new Queue<String>();
        _deck.Enqueue("2h");
        _deck.Enqueue("3h");
        _deck.Enqueue("4h");
        _deck.Enqueue("...");

        var first = _deck.Dequeue(); // 2h
        first = _deck.Dequeue(); // 3h
    }
}

或者您可以简单地使用c#已经拥有的Stack class吗?

class Program
{
    static void Main(string[] args)
    {
        var _deck = new Stack<String>();
        _deck.Push("2h");
        _deck.Push("3h");
        _deck.Push("4h");
        _deck.Push("...");

        var first = _deck.Pop(); // ...
        first = _deck.Pop(); // 4h
    }
}

答案 1 :(得分:37)

您可以分两步完成:

String p1FirstCard = _deck[0];
_deck.RemoveAt(0);

您可以编写自己的扩展帮助方法(我添加了Pop的索引,正如@Fredou建议的那样:

static class ListExtension
{
    public static T PopAt<T>(this List<T> list, int index)
    {
        T r = list[index];
        list.RemoveAt(index);
        return r;
    }
}

然后致电

String p1FirstCard = _deck.PopAt(0);

P.S。 名称可能有点令人困惑。 Pop通常删除最后一个元素,而不是第一个元素。

答案 2 :(得分:4)

如果你想直接等同于pop(),你必须自己编写,因为我认为C#中的任何内容都不会自动有一个“从结尾删除并返回”。但是,有Queue(先进先出)和Stack(先进先出)等级,而不只是List

还有LinkedList类,允许您在开头或结尾添加或删除,但提供的RemoveFirst()RemoveLast()方法不会自动返回项目删除 - 您需要编写像AlexD这样的扩展方法来执行此操作。

所有这些都涉及从列表的开头或结尾删除内容。如果您只想从List的中间删除任意项目,则始终会List.Remove(item)从列表中删除特定项目(而不是按位置)。

答案 3 :(得分:4)

基于AlexD的回答,我添加了几个扩展方法:

public static class ListExtensionMethods
{
    public static T PopAt<T>(this List<T> list, int index)
    {
        var r = list[index];
        list.RemoveAt(index);
        return r;
    }

    public static T PopFirst<T>(this List<T> list, Predicate<T> predicate)
    {
        var index = list.FindIndex(predicate);
        var r = list[index];
        list.RemoveAt(index);
        return r;
    }

    public static T PopFirstOrDefault<T>(this List<T> list, Predicate<T> predicate) where T : class
    {
        var index = list.FindIndex(predicate);
        if (index > -1)
        {
            var r = list[index];
            list.RemoveAt(index);
            return r;
        }
        return null;
    }
}

答案 4 :(得分:0)

 private List<String> _deck = new List<String> {"2h", "3h", "4h", ... }
 //Save into variable first
 String p1FirstCard = _deck[0];
 //Now just remove it
 _deck.RemoveAt(0);

RemoveAt()不会返回任何内容。