【问题标题】:How to fill an existing array using Linq IEnumerable?如何使用 Linq IEnumerable 填充现有数组?
【发布时间】:2020-01-24 11:02:38
【问题描述】:

我有一个包含 20 个项目的数组,但它是空的。

例如我们只使用简单的 int 数组

public int[] Integers = new int[20];

然后我有一个包含很多项目的数据库

public int[] Database = new int[] {
    1, 2, 3, , ..., 1000
}

我想将数据库中的一些项目放入我的数组中

在命令式中我可以这样做:

// loop all my slots
for (int = 0; i < Integers.Length; i++) {

    // If database index of i is empty, then done this loop
    // correction: I'm putting null in case database type is not int
    if(Database[i] == null) {
        break;
    }
    // but when there's still something in database, fill it to current Integers[i]
    else {
        Integers[i] = Database[i] 
    }
}

但我想在 Linq 中使用 Select 和 ForEach,但是 foreach 没有索引 i。

注意:我正在游戏中制作一个库存 UI 物品槽,因此我的 UI 中一次只能看到角色内部的 20 个物品,它还包括分页。我目前正在做:

for (int i = 0; i < _slots.Count; i++)
    _slots[i].SetItem(i < InventoryItems.Count ? InventoryItems[i] : null);

以 setItem 作为副作用;

【问题讨论】:

  • 我不确定您要的是什么?
  • 你能告诉我们你为什么不想使用var Integers = Database.Concat(Enumerable.Repeat(0, 20)).Take(20).ToArray();吗? 这将从Database 获取前20 个条目,并根据需要用零填充。
  • 我可以做Integers.Select( (x,i ) =&gt; { x = Database[i]; return x; });这可能吗?
  • 您是否尝试过我第一条评论中的建议?
  • 我现在不在了,我稍后再试试,但是我认为如果我将它放入 20 大小的数组中可能会出错

标签: c# linq for-loop iteration


【解决方案1】:

只需省略nulls:

Integers = Database.Where(i => i != null).ToArray();

注意,如果要在int 数组中检查null,则需要将其设为int?(可空类型):

public int?[] Integers = new int[20];

public int?[] Database = new int[] {
  1, 2, 3, , ..., 1000
}

事实上,Integer 可以是int[],因为你选择了非空值:)

注意:使用您拥有的代码,您很容易出现索引超出范围异常,因为您对两个数组应用相同的索引。

【讨论】:

  • 哦,超出范围的索引很有帮助,谢谢,一直想知道为什么我一直得到它。
  • @KevinTanudjaja 如果我的回答对您有所帮助,您应该接受它(左侧的绿色复选标记)并可选择支持 :)
  • @KevinTanudjaja 我不能,你必须解释你想要什么,什么是行不通的。而且这应该是另一个问题而不是评论。
  • 好的,抱歉,您的代码Integers = Database.Where(i =&gt; i != null).ToArray(); 会出错吗?将结果放入 20 大小的数组是否可以?
  • @KevinTanudjaja 不要将Integers 初始化为空数组,只需使用此代码初始化即可。如果你按照你的方式初始化它,你需要调整它的大小。
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2012-11-27
  • 2017-11-13
相关资源
最近更新 更多