【问题标题】:MVC 5 How to bind linq result(Number) to array[i]?MVC 5 如何将 linq 结果(数字)绑定到数组 [i]?
【发布时间】:2017-09-14 11:08:08
【问题描述】:

假设我有一个从 1 到 100 的库存槽位,如何从该范围内找到第一个空槽位?

首先,我正在考虑使用 Array.FindIndex,但我被困在这里。

var InventorySlot = (from i in db.InventoryModel where i.userId == 1 select i.slot).ToArray();

int index = Array.FindIndex(InventorySlot, item => item == null );

但这会造成

  • InventorySlot[0] = 1
  • InventorySlot[1] = 3
  • InventorySlot[2] = 4

那么如何创建这样的?

  • InventorySlot[1] = x
  • InventorySlot[3] = x
  • InventorySlot[4] = x

也许我可以使用 Array.FindIndex 来定位空数组?我需要的索引变量是 2(数组中的第一个空数)

【问题讨论】:

  • where i.SlotId == 1 的 linq 查询永远不会返回 i 为空的行。为什么你认为InventorySlot[2] 是或应该是null
  • @GSerg,这取决于 linq 查询中选择的内容。上面的代码没有选择。
  • 抱歉,linq 是韩语混音,所以你们可能无法轻松理解,所以我只是将其更改为更易于理解。现在假设 linq 可以工作。
  • 你可能想要一个 Dictionary 而不是数组。
  • 我认为您需要添加一些类型 - indexi.slot 的类型是什么?

标签: c# arrays performance linq


【解决方案1】:

您需要做的是将数据库中的结果与范围进行比较,没有例外:

var firstEmptySlot = Enumerable.Range(1, InventorySlot.Max()).Except(InventorySlot).First();

如果你想得到最大的槽加一,如果没有槽是空的,你可以这样做:

var firstEmptySlot = Enumerable.Range(1, InventorySlot.Max()+1).Except(InventorySlot).First();

在这种情况下,您需要测试 firstEmptySlot 以确保它是

您可以通过将范围限制为 1 - 100 来结合测试和查询:

var firstEmptySlot = Enumerable.Range(1, Math.Min(InventorySlot.Max()+1, 100)).Except(InventorySlot).FirstOrDefault();

如果从 1 到 100 没有可用的空槽,您将收到 0 回复。

【讨论】:

  • 谢谢。不知何故,它就像一个魅力。虽然我不明白var firstEmptySlot = Enumerable.Range(1, InventorySlot.Max()+1).Except(InventorySlot).First(); 但两者都返回相同的值。
  • 第二个表达式适用于没有跳过任何插槽的情况。假设您已经使用了插槽 1 - 10。第一个表达式将给出错误,第二个表达式将返回 11。我添加了另一个查询,将测试 1 - 100 与查找第一个空槽相结合。
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2010-10-11
  • 2020-01-03
  • 2013-06-10
相关资源
最近更新 更多