提供了一个列表,我想选择给定的2个之间的所有项目。 (包括开头和结尾参数)
我目前的解决方案如下:
private IEnumerable<string> GetAllBetween(IEnumerable<string> list, string begin, string end)
{
bool isBetween = false;
foreach (string item in list)
{
if (item == begin)
{
isBetween = true;
}
if (item == end)
{
yield return item;
yield break;
}
if (isBetween)
{
yield return item;
}
}
}
但肯定有一个漂亮的linq查询可以完成同样的事情吗?
答案 0 :(得分:14)
你可以几乎使用SkipWhile
和TakeWhile
,但你也想要最后一项 - 你希望TakeUntil
的功能来自MoreLINQ }。然后您可以使用:
var query = source.SkipWhile(x => x != begin)
.TakeUntil(x => x == end);
答案 1 :(得分:0)
static IEnumerable<T> GetAllBetween<T>( this List<T> list, T a, T b )
{
var aOffset = list.IndexOf( a );
var bOffset = list.IndexOf( b );
// what to do if one or all items not found?
if( -1 == aOffset || -1 == bOffset )
{
// for this example I will return an empty array
return new T[] { };
}
// what to do if a comes after b?
if( aOffset > bOffset )
{
// for this example i'll simply swap them
int temp = aOffset;
aOffset = bOffset;
bOffset = temp;
}
return list.GetRange( aOffset, bOffset - aOffset );
}
答案 2 :(得分:0)
我认为一个简单的Skip
,Take
应该这样做。我通常把它用于分页ASP.NET结果。
var startIndex = list.IndexOf(begin);
var endIndex = list.IndexOf(end);
var result = list.Skip(startIndex + 1).Take(endIndex - 1 - startIndex);