FirstOrDefault功能默认值



我有一个对象数组,我想在这个数组中找到一些特定对象的索引:

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的产品,则productnull。所以你可以检查一下,跳过IndexOf(),选择null:

if (product == null)
{
    return -1;
}
else
{
    return Array.IndexOf(products, product);
}

当前代码返回1,意味着products[1]null

Per Microsoft:

如果集合不包含元素,default(TSource)的值有时不是您想要使用的默认值。您可以使用DefaultIfEmpty(IEnumerable, TSource)方法来指定在集合为空时要使用的默认值,而不是检查不需要的默认值然后在必要时更改它。然后,调用First(IEnumerable)来获取第一个元素。

然而,我不确定这是你的问题。你的代码在语法上不正确(你在某个地方缺少')'),但看起来你在Where()之后调用了FirstOrDefault()。这将返回一个元素或null。因为你说id为"xxx"的项不存在,它将检查数组中的索引为null。indexOf的默认值是(同样,根据Microsoft)"数组的下界减1 "这应该返回-1(我希望)而不是1。

结论:好好看看你的代码,看看到底发生了什么。把这个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。

对了,你少了一个括号

最新更新