搜索整数数组以获取重复项

时间:2015-09-29 18:04:10

标签: c# arrays

我目前正在使用C#创建一个非常基本的游戏,并且我创建了一个库存系统,它使用一个非常简单的命令(Items.Add(id,amount)),您可以将项目添加到所述库存中。我希望能够做的,我当前的系统没有做的是能够有效地“搜索”我的库存数组,这是一个包含物品ID和物品数量的2D数组。我目前的系统是这样的:

public static void add(int id, int amount)
{
    for (int i = 0; i < Ship_Builder.Player.invCount; i++)
    {
        if (Ship_Builder.Player.inv[i, 0] == 0)
        {
            Ship_Builder.Player.inv[i, 0] = id; 
            Ship_Builder.Player.inv[i, 1] = amount;
        }
    }

    Ship_Builder.Player.invCount++;
}

我希望它(在其他情况下)能够搜索数组。我确实有这个:

else if (Ship_Builder.Player.inv[i, 0] == Ship_Builder.Player.inv[i + 1, 0])
{
    //Do
}

之前,但它没有按照我想要的方式工作。 任何帮助将不胜感激,谢谢, 劳伦斯。

3 个答案:

答案 0 :(得分:0)

这里有很多事情(除了广泛的笔触之外,没有足够的细节给出任何答案),但是如何处理这样的事情就是从使用对象开始面向设计而不是依赖于数组中的索引位置。我定义了这样的东西:

public class InventoryItem
{
    public int Id { get; set; }
    public int Amount { get; set; }
    // Now I can add other useful properties here too
    // ...like Name perhaps?
}

现在我将我的广告资源设为Dictionary<int,InventoryItem>,并在我的广告资源中添加内容可能如下所示:

public void Add(int id, int amount) 
{
    // assuming myInventory is our inventory
    if (myInventory.ContainsKey(id)) {
        myInventory[id].Amount += amount;
    }
    else {
        myInventory[id] = new InventoryItem() 
        {
            Id = id,
            Amount = amount
        };
    }
}

现在它不是必要您实际使用的是InventoryItem课程,您可以坚持使用Dictonary<int,int>,但您可能会找到你通过它来完成你更喜欢使用的东西。

然后你可能有一个所有对象的主词典,只需将它们添加到你的库存中,所以你最终得到的结果如下:

public void Add(InventoryItem item, int amount) 
{
    // assuming myInventory is our inventory
    if (myInventory.ContainsKey(item.Id)) {
        myInventory[item.Id].Amount += amount;
    }
    else {
        myInventory[item.Id] = new InventoryItem(item)   // assuming you added a 
                                                         // copy constructor, for example
        {
            Amount = amount
        };
    }
}

答案 1 :(得分:0)

正如评论所示,您应该使用Dictionary来执行此类任务。但是如果你必须使用2-d数组,这是(我假设)在我们添加任何项目之前预先填充零,那么像你提出的if-else语句赢了& #39; t诀窍。您需要做的是首先遍历数组以寻找匹配的id,并且每次id不匹配时,您必须检查id是否与您相关public static void add(int id, int amount) { for (int i = 0; i < Ship_Builder.Player.invCount; i++) { if (Ship_Builder.Player.inv[i, 0] != id) { if (Ship_Builder.Player.inv[i, 0] == 0) { Ship_Builder.Player.inv[i, 0] = id; Ship_Builder.Player.inv[i, 1] = amount; Ship_Builder.Player.invCount++; continue; } } else { Ship_Builder.Player.inv[i, 1] += amount; continue; } } } #39;当前检查等于0.如果是,那么你已遍历所有&#34;插槽&#34;

其中有一些项目没有找到匹配,这意味着这个项目必须进入另一个空位。

id

警告!我的回答是假设您在具有最小索引的空插槽中找到新项目。此外,如果要移除项目并将<a>设置为零,那么在分配新项目之前,您必须首先遍历整个数组以搜索匹配的索引。如果阵列很大,那么在时间上可能会非常昂贵。

答案 2 :(得分:0)

根据速度性能要求(使用数组应该只比这稍快),您可以只跳过硬编码值和数组。这有一些半高级主题:

public abstract class InventoryItem
// or interface
{
  public abstract string Name { get; }
  public int Count { get; set; }
}

public class InventoryGold : InventoryItem 
{
  public string Name { get { return "Gold" } }
}

public abstract class InventoryWeapon : InventoryItem { }

public class OgreSlayingKnife : InventoryWeapon
{
  public string Name { get { return "Ogre Slaying Knife"; } }
  public int VersusOgres { get { return +9; } }
}

public UpdateCount<Item>(this ICollection<Item> instance, 
  int absoluteCount)
{
  var item = instance.OfType<Item>().FirstOrDefault();

  if (item == null && absoluteCount > 0)
  {
    item = default(Item);
    item.Count = absoluteCount;
    instance.add(item);
  }
  else
  {
    if (absoluteCount > 0)
      item.Count = absoluteCount;
    else
      instance.Remove(item);
  }
}

// Probably should be a Hashset
var inventory = new List<InventoryItem>();

inventory.UpdateCount<InventoryGold>(10);

inventory.UpdateCount<OgreSlayingKnife(1)