0

我一直在研究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 类型。有人可以帮忙吗?

帮助表示赞赏。

4

2 回答 2

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();
}

你可以用这个。但是,如果您传入一个空的泰迪熊集合,它将引发异常。改用 FirstOrDefault() 将避免抛出,但返回 null,这是您声明不想要的。

是 null 合并运算符,如果左侧计算结果??为 null,则将返回右侧值。微软_

于 2013-05-10T16:49:00.307 回答
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空合并运算符??从 中获取第一条记录teddies

的实现getPrevious将是这个的“镜像”,使用LastOrDefault()而不是FirstOrDefault().

于 2013-05-10T16:48:23.187 回答