如果数据集结束,则返回第一条记录

时间:2013-05-10 16:43:40

标签: c# linq

我一直致力于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类型的所有麻烦。有人可以帮忙吗?

帮助表示赞赏。

2 个答案:

答案 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()返回nullnull-coalescing operator ??获取teddies的第一条记录{1}}。

使用getPrevious代替LastOrDefault()FirstOrDefault()的实施将是“镜像”。