首页 > 解决方案 > 在仅运行一次的“foreach”循环中使用 LINQ

问题描述

这是为了游戏。我正在尝试在玩家加载游戏时将他们的物品重新加载到他们的库存中。下面的“itemStrings”是玩家保存游戏时所有项目名称的字符串列表。这是代码:

void Load(){ List<string> itemStrings = SaveLoad.Load<List<string>>("Inventory");

        foreach(string nameString in itemStrings)
        {
            loadReference = itemDatabase.itemsDatabaseList.Where(obj => obj.name == nameString).First();
            bool wasAdded = instance.Add(loadReference);
    }}

作为参考,itemDatabase 是对一个类 ItemDatabase 的引用。存储游戏中的每个项目。loadreference 是一个名为 Item 的类,它在此 Inventory 类的开头声明。

我要做的是在数据库中搜索名称与 itemStrings 中的字符串匹配的项目,然后获取该项目并将其添加到玩家的库存中。这个“foreach”对 itemStrings 列表中的第一项正常工作,但它只运行一次。所以它只会将一件物品加载到库存中,无论之前保存了多少。

标签: c#listlinqloopsforeach

解决方案


我会重写你的内部查询,只返回一个请求中的所有值。

void Load()
{ 
  var inventory = SaveLoad.Load<List<string>>("Inventory")
    .Join(itemDatabase.itemDataList, name=>name, item=>item.name, (name,item)=>item);
  // Use one of the following three methods:
  instance.AddRange(inventory);
  // or if instance is just a List of items then...
  instance = inventory.ToList();
  // or if there is no AddRange, and instance is not just a List:
  foreach(var item in inventory)
  {
    instance.Add(item);
  }
}

或者,为自己创建一个 GetInventory 方法:

IEnumerable<Item> GetInventory()
{ 
  return SaveLoad.Load<List<string>>("Inventory")
    .Join(itemDatabase.itemDataList, name=>name, item=>item.name, (name,item)=>item);
}

然后你可以在你的 Load 方法中做任何你想做的事情。


推荐阅读