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)
可以用吗?我很感激一些建议
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);