c# - 在 'foreach' 循环中使用 LINQ 仅运行一次

标签 c# list linq loops foreach

这是一个游戏。我试图在玩家加载游戏时将其元素重新加载到他们的库存中。下面的“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/

相关文章:

c# - visual studio 可以在 Debug模式下自动硬编码对象的副本吗?

python - 根据两个字典对列表进行排序

c# - 返回方法调用之前更新本地 iqueryable 列表

c# - 根据组对 LINQ 分组查询进行排序

c# - 从集合中查找一组值

c# - 将每个 CSV 文件记录转换为单独的 JSON 文件

python - 如何使用 python 按字母顺序对 .txt 文件进行排序?

android - 创建 float 弹出列表

c# - 可变参数的LINQ方法

c# - 流利的查询表达式——两者之间有什么优势吗?