Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数组中的所有项移回一个位置_C#_Arrays - Fatal编程技术网

C# 将数组中的所有项移回一个位置

C# 将数组中的所有项移回一个位置,c#,arrays,C#,Arrays,我有一个数组: string[] inventory = { "empty", "empty", "empty", "empty", "empty"} 在代码的后面,通过在“游戏”中收集物品,这些空物品将变为“物品名称”。 然后,用户可以使用它们或从库存中删除它们。当用户删除某些项时,我需要将数组中的以下所有项移回一个位置。等等: 库存包含项目“a”“b”“c”“d”“空”: 当用户删除项“a”时,项“b”、“c”、“d”和“empty”必须回到数组中的一个位置,因此新数组将是: invent

我有一个数组:

string[] inventory = { "empty", "empty", "empty", "empty", "empty"}
在代码的后面,通过在“游戏”中收集物品,这些空物品将变为“物品名称”。 然后,用户可以使用它们或从库存中删除它们。当用户删除某些项时,我需要将数组中的以下所有项移回一个位置。等等:

库存包含项目“a”“b”“c”“d”“空”:

当用户删除项“a”时,项“b”、“c”、“d”和“empty”必须回到数组中的一个位置,因此新数组将是:

inventory = { "b", "c", "d", "empty", "empty" };
一种方法是将数组中的所有其他项保存到另一个数组中,然后使用数组中已更改的“位置”手动重新声明库存。但如果我有库存[100]。。。有没有其他方法可以做到这一点,而不需要长时间的重新澄清

谢谢您的帮助。

您可以使用
List

您将没有元素的限制。删除一个元素后,另一个元素将保持有序,无需进行任何重新排列。

您可以创建库存类,该类将保留项目并充当项目枚举器(它将为枚举添加空项目,但不会将其保留在内存中):

结果:

b, empty, empty, empty, empty

听起来你需要的是
列表
,而不是数组。我认为
队列
最适合这样做,
列表
至少比这样使用数组要好。为什么不使用
列表
或类似的没有固定长度的集合呢?队列不适合这样做。看起来他可能也想保持列表的排序。此外,您不能将队列中的元素带外删除。。。。“队列不适合他的应用程序,因为用户可以从库存中删除项目(除非他们只能删除第一个项目…这没有太大意义),因此,队列是一种简单的链接方式。”King说。@N4TKD我不确定LinkedList(更具体地说,List)会有多大的杀伤力。这将解决问题。它相当直观,易于理解。无论如何,在阅读了问题的描述之后,列表是我想到的第一件事,也是我的解决方案。链表不仅仅是列出它,正如链接所说,“链表是一个由一组节点组成的数据结构”,每个你链接的Wiki,到目前为止,这是过分的。
System.Collections.Generic
List
类不是链表。这是我的错。。意思是名单。感谢您指出我的错误:)一种可能是包括一个检查,以防止
emptyItem
魔法字符串被添加到清单中。@JeppeStigNielsen也同意,但我将保留这些详细信息给OP执行。只是想展示一下定义
GetEnumerator
的主要思想+1,而不是您自己单独的
Join
方法。
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