这是一个游戏。我试图在玩家加载游戏时将其元素重新加载到他们的库存中。下面的“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 列表中的第一个项目可以正确工作,但它只运行一次。因此,无论之前保存了多少元素,它都只会将一件元素加载到库存中。
最佳答案
我会重写您的内部查询,只返回一个请求中的所有值。
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 方法中用它做任何你想做的事情。
关于c# - 在 'foreach' 循环中使用 LINQ 仅运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61618947/