2013-05-10 75 views
0

我一直在努力处理next()previous()功能,以便从记录到记录中的一组数据中移动。我提出的方法非常完美,并且始终按照需要返回类型 - 除了第一个和最后一个记录。如果我查看最后一条记录,我希望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型 - 否则,我到所有种类的麻烦处理空类型。任何人都可以协助

帮助赞赏。

+1

您可以尝试将“IEnumerable”转换为“LinkedList”。你怎么看待这件事? – 2013-05-10 16:47:30

回答

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,将返回右边的值。 MSDN

+0

@Estoric很多谢谢,现货:)谢谢。 – dooburt 2013-05-10 17:24:01

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

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

+0

+1就像彻底的答案一样。耻辱我不能将2标记为正确。谢谢:) – dooburt 2013-05-10 17:24:20

+0

@dooburt请注意,这两个答案是不一样的:即使当'teddies'为空时,我也不会崩溃。 – dasblinkenlight 2013-05-10 17:27:37

+0

感谢@dasblinkenlight,但'teddies'永远不会为空,因为集合已传递给它。仍然,赞赏:) – dooburt 2013-05-10 18:26:33

相关问题