c# - 在仅运行一次的“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 列表中的第一项正常工作,但它只运行一次。所以它只会将一件物品加载到库存中,无论之前保存了多少。
解决方案
我会重写你的内部查询,只返回一个请求中的所有值。
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 方法中做任何你想做的事情。
推荐阅读
- python-3.x - 为什么我的代码在计算百分比时使用熊猫返回“nan”?
- laravel - 在 laravel 上统计数据库中的数据
- selenium - TypeError:“模块”对象不可调用 selinium
- javascript - 滚动到顶部并同时刷新页面
- java - Java用拦截器发送http post
- javascript - 发送表单时如何自动登录/注册用户?
- angularjs - 这个拼接定义正确吗?
- r - 当绘图的限制固定时,ggplot2 中的抖动点
- javascript - 如何在javascript中使用当前日期、时间、秒、毫秒获取当前时间戳?
- dart - 如何在flutter android中读取/打开e-pub文件?