2017-09-14 14 views
-1

比方說,我有一個庫存插槽範圍從1到100如何找到該範圍內的第一個空插槽?MVC 5如何將linq result(Number)綁定到array [i]?

首先,我想使用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(數組中的第一個空號)

+0

帶有'where i.SlotId == 1'的linq查詢將永遠不會返回其中'i'爲空的行。爲什麼你認爲'InventorySlot [2]'是或應該是'null'? – GSerg

+0

@GSerg,這取決於在linq查詢中選擇什麼。上面的代碼沒有選擇。 – derloopkat

+0

對不起,linq是混合韓語詞,所以你可能不會很容易理解,所以我只是簡單地把它改變得更容易理解。現在只是假設linq會起作用。 – Kai

回答

0

你需要做的結果是什麼,從與該範圍的數據庫進行比較,而不例外:如果你想要得到的

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

最大的老虎加一,如果沒有插槽是空的,你可以這樣做:

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

您需要在這種情況下,測試firstEmptySlot,以確保它是< = 100

你可以通過限制範圍爲1相結合的測試和查詢 - 100:

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

你會得到一個0回來,如果1沒有空插槽 - 100可用。

+0

謝謝。不知何故它像一個魅力。雖然我不明白'var firstEmptySlot = Enumerable.Range(1,InventorySlot.Max()+ 1).Except(InventorySlot).First();'但兩者都返回相同的值。 – Kai

+0

第二個表達式適用於沒有插槽被跳過的情況。假設您已經使用了插槽1 - 10。第一個表達式會給出一個錯誤,第二個表達式將返回11.我添加了另一個查詢,它將測試1 - 100與查找第一個空槽相結合。 – NetMage

相關問題