C# 如果数据集结束,则返回第一条记录
我一直在开发C# 如果数据集结束,则返回第一条记录,c#,linq,C#,Linq,我一直在开发next()和previous()功能,以便在IEnumerable数据集上从一个记录移动到另一个记录。我想出的方法工作得很好,总是根据需要返回类型——除了第一条和最后一条记录。如果我查看最后一条记录,我希望LINQ返回第一条记录,如果我查看第一条记录,前一条记录将是最后一条记录。使记录之间的移动无穷无尽 我目前有这些方法(我已为隐私重命名了类型):- private static Teddy\u getNext(字符串代码,IEnumerable teddies) { 返回tedd
next()
和previous()
功能,以便在IEnumerable
数据集上从一个记录移动到另一个记录。我想出的方法工作得很好,总是根据需要返回类型——除了第一条和最后一条记录。如果我查看最后一条记录,我希望LINQ返回第一条记录,如果我查看第一条记录,前一条记录将是最后一条记录。使记录之间的移动无穷无尽
我目前有这些方法(我已为隐私重命名了类型):-
private static Teddy\u getNext(字符串代码,IEnumerable teddies)
{
返回teddies.SkipWhile(i=>!i.Code.Equals(Code.ToUpper()).Skip(1.FirstOrDefault());
}
私有静态Teddy_getPrevious(字符串代码,IEnumerable teddies)
{
返回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.FirstOrDefault();
}
private static Teddy\u getNext(字符串代码,IEnumerable teddies)
{
返回teddies.SkipWhile(i=>!i.Code.Equals(Code.ToUpper()).Skip(1.FirstOrDefault())
??泰迪熊。FirstOrDefault();
}
其工作方式是当Skip(1)
超过输入的末尾时,确保FirstOrDefault()
返回null
,从teddies
中获取第一条记录
getPrevious
的实现将是这方面的“镜像”,使用LastOrDefault()
而不是FirstOrDefault()
,我将尝试以下实现:
private static Teddy _getNext(string code, IEnumerable<Teddy> teddies)
{
return teddies.SkipWhile(i => !i.Code.Equals(code.ToUpper())).Skip(1).FirstOrDefault()
?? teddies.FirstOrDefault();
}
private static Teddy\u getNext(字符串代码,IEnumerable teddies)
{
返回teddies.SkipWhile(i=>!i.Code.Equals(Code.ToUpper()).Skip(1.FirstOrDefault())
??泰迪熊。FirstOrDefault();
}
其工作方式是当Skip(1)
超过输入的末尾时,确保FirstOrDefault()
返回null
,从teddies
中获取第一条记录
使用LastOrDefault()
而不是FirstOrDefault()
private static tedy\u getNext(字符串代码,IEnumerable泰迪熊),实现getPrevious
将是这方面的“镜像”
{
返回teddies.SkipWhile(i=>!i.Code.Equals(Code.ToUpper()).Skip(1.FirstOrDefault())
?泰迪熊。第一个();
}
私有静态Teddy_getPrevious(字符串代码,IEnumerable teddies)
{
返回teddies.TakeWhile(i=>!i.Code.Equals(Code.ToUpper()).LastOrDefault()
?泰迪熊。最后一个();
}
你可以用这个。但是,如果您传入一个空的teddies集合,它将抛出一个异常。改用FirstOrDefault()可以避免抛出,但返回null,这是您声明不需要的
??
是null coalesce运算符,如果左侧的计算结果为null,则将返回右侧的值 private static Teddy\u getNext(字符串代码,IEnumerable teddies)
{
返回teddies.SkipWhile(i=>!i.Code.Equals(Code.ToUpper()).Skip(1.FirstOrDefault())
?泰迪熊。第一个();
}
私有静态Teddy_getPrevious(字符串代码,IEnumerable teddies)
{
返回teddies.TakeWhile(i=>!i.Code.Equals(Code.ToUpper()).LastOrDefault()
?泰迪熊。最后一个();
}
你可以用这个。但是,如果您传入一个空的teddies集合,它将抛出一个异常。改用FirstOrDefault()可以避免抛出,但返回null,这是您声明不需要的
??
是null coalesce运算符,如果左侧的计算结果为null,则将返回右侧的值 您可以尝试将该IEnumerable
转换为LinkedList
。您觉得怎么样?您可以尝试将IEnumerable
转换为LinkedList
。你觉得怎么样?+1表示同样彻底的回答。遗憾的是,我不能将2标记为正确。谢谢:)@dooburt注意这两个答案不一样:即使teddies
为空,我的也不会崩溃。谢谢@dasblinkenlight,但是teddies
永远不能为空,因为集合被传递给它。尽管如此,我还是很感激:)+1的回答同样透彻。遗憾的是,我不能将2标记为正确。谢谢:)@dooburt注意这两个答案不一样:即使teddies
为空,我的也不会崩溃。谢谢@dasblinkenlight,但是teddies
永远不能为空,因为集合被传递给它。尽管如此,我还是很感激:)
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();
}