我有一张名为_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”处执行了吗? (推/弹工作在列表的“尾部”或“结尾”。)
如果没有,我应该如何删除第一个元素但将其保存在变量中?
答案 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()不会返回任何内容。