FirstOrDefault功能默认值
本文关键字:默认值 功能 FirstOrDefault | 更新日期: 2023-09-27 18:09:30
我有一个对象数组,我想在这个数组中找到一些特定对象的索引:
int ix = Array.IndexOf(products, products.Where(item => item != null && item.Id == "xxx").FirstOrDefault());
Id="xxx"的Item不存在,但ix的结果为1。我猜int的默认值是1。我如何知道1是属于第一项还是默认值?如果我能将默认值设置为-1就好了。
最后,我已经用findIndex方法完成了它,但想知道如何用indexOf方法完成它。
所以你有一个问题的两个部分。首先,你想找到一个产品:
var product = products.FirstOrDefault(item => item != null && item.Id == "xxx");
当找到该产品时,您希望在products
集合中找到它的索引:
int index = Array.IndexOf(products, product);
你用FirstOrDefault()
已经成功了一半。如果不存在Id为xxx的产品,则product
为null
。所以你可以检查一下,跳过IndexOf()
,选择null
:
if (product == null)
{
return -1;
}
else
{
return Array.IndexOf(products, product);
}
当前代码返回1,意味着products[1]
是null
。
Per Microsoft:
然而,我不确定这是你的问题。你的代码在语法上不正确(你在某个地方缺少')'),但看起来你在Where()之后调用了FirstOrDefault()。这将返回一个元素或null。因为你说id为"xxx"的项不存在,它将检查数组中的索引为null。indexOf的默认值是(同样,根据Microsoft)"数组的下界减1 "这应该返回-1(我希望)而不是1。如果集合不包含元素,default(TSource)的值有时不是您想要使用的默认值。您可以使用DefaultIfEmpty(IEnumerable, TSource)方法来指定在集合为空时要使用的默认值,而不是检查不需要的默认值然后在必要时更改它。然后,调用First(IEnumerable)来获取第一个元素。
结论:好好看看你的代码,看看到底发生了什么。把这个linq语句分成两个不同的部分。
var item = products.Where(item => item != null && item.Id == "xxx").FirstOrDefault();
int ix = Array.IndexOf(products, item);
然后遍历代码,检查所有的值。我相信你会发现你的问题,它不会是你所期望的。
如果你想在struct上调用FirstOrDefault,但默认值与有效值相同,你可以这样做:
(我不会使用你的代码,因为缺少括号阻止知道你的目标是什么)
myCollection.Where(myCondition).Cast<int?>().FirstOrDefault();
这样,0
将是第一个正确的值,而null
将意味着没有正确的值。
First或default返回第一个元素(在本例中,在where条件中找到的第一个项)或默认值。
如果满足条件将返回一个OBJECT(第一个满足条件的对象)。
然而,如果条件不满足,它将返回null (OBJECT的默认值),所以你的代码将试图找到indexOf(产品,null)..这将是一个NullReferenceException。
firstOrDefault在数组内部的OBJECT类型下完成他的工作。
在此之后,结果作为参数传递给方法indexOf。
"indexOf"将返回在"where"条件下第一个对象的索引。
如果没有找到,indexOf将返回-1。
对了,你少了一个括号