Linq - 获取2个匹配元素之间的所有项目

时间:2014-02-19 10:18:18

标签: c# linq

提供了一个列表,我想选择给定的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查询可以完成同样的事情吗?

3 个答案:

答案 0 :(得分:14)

你可以几乎使用SkipWhileTakeWhile,但你也想要最后一项 - 你希望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)

我认为一个简单的SkipTake应该这样做。我通常把它用于分页ASP.NET结果。

 var startIndex = list.IndexOf(begin);
 var endIndex = list.IndexOf(end);
 var result = list.Skip(startIndex + 1).Take(endIndex - 1 - startIndex);