我一直致力于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
类型 - 否则我会陷入处理null类型的所有麻烦。有人可以帮忙吗?
帮助表示赞赏。
答案 0 :(得分:2)
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,你声明你不想要它。
??
是null coalesce运算符,如果left计算为null,则返回右手值。 MSDN
答案 1 :(得分:1)
我会尝试这个实现:
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
,null-coalescing operator ??
获取teddies
的第一条记录{1}}。
使用getPrevious
代替LastOrDefault()
,FirstOrDefault()
的实施将是“镜像”。