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

本文关键字:第一个 记录 返回 数据集 结束 如果 | 更新日期: 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()