列表中的LINQ下一项

gri*_*egs 15 linq

纵观我的问题这里,我现在想返回下一个推荐对象(后)符合条件的人.

所以说我找到了第10项中的第6项,我希望查询返回第7项.

或者,还有更好的方法?

Jer*_*ter 40

这是我目前最好的方法:

MyList.SkipWhile(item => item.Name != "someName").Skip(1).FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

较早的答案使用Skip(1).Take(1)哪个有效,但返回一个结果的列表.在我的情况下(也许是OP的情况),我们正在寻找实际的项目.所以我的代码跳过它直到它到达我们正在寻找的那个(一个Where会返回一个子集,所以我们将无法访问下一个项目)然后再跳过一个然后获取该项目.


EMP*_*EMP 15

由于您有一个List<T>对象,您可以使用其FindIndex方法而不是Where获取第一个匹配项的索引而不是项本​​身:

int index = recommendations.FindIndex(rp =>
                                            rp.Products.Any(p => p.Product.Code == "A") 
                                         && rp.Products.Any(p => p.Product.Code == "B")
                                      );
Run Code Online (Sandbox Code Playgroud)

获得索引后,您可以获得下一个项目或上一个项目或任何您想要的项目.


Jim*_*son 6

这样的事情怎么样:

public static class Extension
{
    public static T Next<T>(this IEnumerable<T> source, Func<T, bool> predicate)
    {
        bool flag = false;

        using (var enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                if (flag) return enumerator.Current;

                if(predicate(enumerator.Current))
                {
                    flag = true;
                }
            }
        }
        return default(T);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像对待Where一样调用它

Products.Next(x => x.Whatever);
Run Code Online (Sandbox Code Playgroud)


Abd*_*oor 6

试试这个吧


下一个项目

MyList.SkipWhile(x => x != value).Skip(1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

上一篇项目说明:Reverse()不适用于LINQ to SQL

 var MyList2 = MyList.ToList();
 MyList2.Reverse();
 MyList2.SkipWhile(x => x != value).Skip(1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

  • 是的!你是对的,它会在 LINQ to SQL 的情况下抛出错误。但我不认为我们在这里谈论的是 LINQ to SQL。让我编辑我的答案,以便人们应该知道它。 (2认同)