如果数据集结束,返回第一个记录
本文关键字:第一个 记录 返回 数据集 结束 如果 | 更新日期: 2023-09-27 18:12:58
我一直在研究next()
和previous()
功能,以便在IEnumerable<T>
数据集上从记录到记录移动。我提出的方法工作完美,总是返回我需要的类型-除了第一个和最后一个记录。如果我查看最后一个记录,我希望LINQ返回第一个记录,如果我查看第一个记录,上一个记录将是最后一个记录。使记录之间的移动永无止境。
我目前有这些方法,(为了隐私,我已经重命名了类型):-
private static Teddy _getNext(string code, IEnumerable<Teddy> teddies)
{
return teddies.SkipWhile(i => !i.Code.Equals(code.ToUpper())).Skip(1).FirstOrDefault();
}
private static Teddy _getPrevious(string code, IEnumerable<Teddy> teddies)
{
return teddies.TakeWhile(i => !i.Code.Equals(code.ToUpper())).LastOrDefault();
}
我仍然希望LINQ返回一个Teddy
类型-否则我进入各种麻烦处理空类型。有人能帮忙吗?
帮助感激。
private static Teddy _getNext(string code, IEnumerable<Teddy> teddies)
{
return teddies.SkipWhile(i => !i.Code.Equals(code.ToUpper())).Skip(1).FirstOrDefault()
?? teddies.First();
}
private static Teddy _getPrevious(string code, IEnumerable<Teddy> teddies)
{
return teddies.TakeWhile(i => !i.Code.Equals(code.ToUpper())).LastOrDefault()
?? teddies.Last();
}
你可以用这个。但是,如果传入一个空的teddies集合,它将抛出异常。使用FirstOrDefault()可以避免抛出,但返回null,这是您声明不想要的。
??
是空合并操作符,如果左值为空,则返回右值。MSDN。
我会尝试这样的实现:
private static Teddy _getNext(string code, IEnumerable<Teddy> teddies)
{
return teddies.SkipWhile(i => !i.Code.Equals(code.ToUpper())).Skip(1).FirstOrDefault()
?? teddies.FirstOrDefault();
}
它的工作方式是,当Skip(1)
经过输入的末尾时,确保FirstOrDefault()
返回null
,空合并运算符??
从teddies
获取第一条记录。
getPrevious
的实现将是这个的"镜像",使用LastOrDefault()
而不是FirstOrDefault()
。