在包含空项的列表上使用带有谓词的 Exsist<T>

问题描述 投票:0回答:1
我试图使用类似 listx.FindIndex(SomePredicate) 的内容查找列表中项目的索引,但它给出“NullReferenceException:对象引用未设置为对象的实例”。

起初我不太确定它是什么,所以我也尝试使用类似 listx.Exsist(SomePredicate) 的东西。该列表具有固定长度并且包含空值。

(用于在Unity中构建库存系统。)

我的(非常)简化的代码:

public class Item { public int id; public string itemname; // constructor etc ... } // in another class: List<Item> inventory = new List<Item>(); for (int i = 0; i < 4; i++) { inventory.Add(null); } inventory[0] = new Item(0, "YellowBox"); inventory[1] = new Item(1, "RedBox"); // inventory[2] stays null // inventory[3] stays null string itemname = "RedBox"; inventory.Exists(item => item.itemname == itemname) // WORKING because it finds a match before it runs into a null string itemname = "BlueBox"; inventory.Exists(item => item.itemname == itemname) // NOT WORKING, I guess because it runs into a null in inventory[2] // and it can't get an itemname from null
有人知道先检查 null 或有 .Exsist 的替代方案吗?

写下这个问题我现在有了一个想法。我认为仅跳过 null 是不够的,因为我需要索引,但也许是这样的。

public int FindItemIndex(string itemname) { int index; for (int i = 0; i < 4; i++) { if (inventory[i] == null) { index = -1; continue; } if (inventory[i].itemname == itemname) {return i} index = -1; } return index; }
然后我可以使用类似的东西:

if (FindItemIndex(string itemname) < 0) { // code for item not found } else { // code where I use the index, for example remove item at inventory[index]
或者“inventory.Where(Item => Item != null)”可用吗?

我很感激一些建议

c# list null find
1个回答
0
投票
inventory.Exists(item => item?.itemname == itemname)
    
© www.soinside.com 2019 - 2024. All rights reserved.