我有一个数组:
string[] inventory = { "empty", "empty", "empty", "empty", "empty"}
稍后在代码中,通过收集“在游戏中”的项目,这些空项目将更改为“项目名称”。 然后,用户可以使用它们或从库存中删除它们。当用户删除某个项目时,我需要将所有后续项目移回阵列中的一个位置。等:
库存包含项目“a”“b”“c”“d”“空”:
string[] inventory = { "a", "b", "c", "d" "empty" };
当用户删除项目“a”时,项目“b”“c”“d”和“empty”必须在数组中返回一个位置,因此新数组将为:
inventory = { "b", "c", "d", "empty", "empty" };
执行此操作的一种方法是将阵列中的所有其他项目保存到另一个阵列,然后手动重新声明阵列中已更改“位置”的库存。但是,如果我有库存[100] ...有没有其他方法可以做到这一点,没有那么长的重新声明?
感谢您的帮助。
答案 0 :(得分:2)
您可以创建Inventory类,它将保留项目并充当项目枚举器(它将为枚举添加空项,但不会将它们保留在内存中):
public class Inventory : IEnumerable<string>
{
private readonly int size;
private const string emptyItem = "empty";
private List<string> items = new List<string>();
public Inventory(int size)
{
this.size = size;
}
public void Add(string item)
{
if (items.Count == size)
throw new Exception("Inventory is full");
items.Add(item);
}
public void Remove(string item)
{
items.Remove(item);
}
public IEnumerator<string> GetEnumerator()
{
return items.Concat(Enumerable.Repeat(emptyItem, size - items.Count))
.GetEnumerator();
}
IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
用法:
Inventory inventory = new Inventory(5);
inventory.Add("a");
inventory.Add("b");
inventory.Remove("a");
var result = String.Join(", ", inventory);
结果:
b, empty, empty, empty, empty
答案 1 :(得分:0)
您可以使用List<string>
。
你不会有元素限制。删除一个元素后,其他元素将按顺序保留,您无需进行任何重新调整。