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

问题描述 投票:0回答:1
我正在尝试查找列表中某个项目的索引,例如

listx.FindIndex(SomePredicate<T>)
但我收到错误

NullReferenceException:未将对象引用设置为对象的实例

起初我不太确定它是什么,所以我也尝试使用类似

listx.Exists(SomePredicate<T>)

的东西。该列表具有固定长度并且包含空值(用于在 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 还是有替代方案 

.Exists

写下这个问题我现在有了一个想法。我认为仅跳过 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)

item?.itemname

 表示如果 item 不为 null,则调用 itemname。如果该项为 null,则谓词解析为 
null == itemName

Linqs。Any 也可以工作。

var inventoryItemExists = inventory.Any(item => item?.itemName == itemName);
您可以使用where ie。

var inventoryItemExists = inventory.Where(item => item != null).Any(item => item.itemName == itemName);
    
© www.soinside.com 2019 - 2024. All rights reserved.