Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq-获取2个匹配元素之间的所有项目_C#_Linq - Fatal编程技术网

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

C# Linq-获取2个匹配元素之间的所有项目,c#,linq,C#,Linq,提供了一个列表,我想选择2个给定项目之间的所有项目。(包括开始和结束参数) 我目前的解决办法如下: private IEnumerable<string> GetAllBetween(IEnumerable<string> list, string begin, string end) { bool isBetween = false; foreach (string item in list) { if (item == begi

提供了一个列表,我想选择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;
        }
    }
}
private IEnumerable GetAllBetween(IEnumerable列表、字符串开始、字符串结束)
{
bool-isBetween=false;
foreach(列表中的字符串项)
{
如果(项目==开始)
{
isBetween=true;
}
如果(项目==结束)
{
收益回报项目;
屈服断裂;
}
如果(介于两者之间)
{
收益回报项目;
}
}
}
但是肯定会有一个相当好的linq查询完成同样的事情吗?

您几乎可以使用
SkipWhile
TakeWhile
,但是您还需要最后一项-您需要from的功能。然后,您可以使用:

var query = source.SkipWhile(x => x != begin)
                  .TakeUntil(x => x == end);
static IEnumerable GetAllBetween(此列表,ta,tb)
{
var aOffset=list.IndexOf(a);
var bOffset=list.IndexOf(b);
//如果未找到一个或所有项目,该怎么办?
如果(-1==aOffset | |-1==bOffset)
{
//对于本例,我将返回一个空数组
返回新的T[]{};
}
//如果a在b之后怎么办?
如果(aOffset>bOffset)
{
//对于这个例子,我将简单地交换它们
int temp=偏移量;
aOffset=bOffset;
bOffset=温度;
}
return list.GetRange(aOffset,bOffset-aOffset);
}

我认为一个简单的
跳过
接受
就可以了。我通常将其用于分页ASP.NET结果站点

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

为什么会有漂亮的东西?这不是一个频繁的任务。它看起来像是一个简单任务的大量代码,所以我希望使用Linq可以将其减少到3-5行?事实上,我同意John Saunders的观点。尽管如此,如果您经常使用它,您可以将其作为扩展方法编写。
 var startIndex = list.IndexOf(begin);
 var endIndex = list.IndexOf(end);
 var result = list.Skip(startIndex + 1).Take(endIndex - 1 - startIndex);