C# 使用LINQ的切割列表

C# 使用LINQ的切割列表,c#,linq,C#,Linq,我有一个列表,其中我想剪切第一个真值之前的所有假值,以及最后一个真值之后的所有假值 我知道我可以从每个方向做一个循环。我只是好奇,是否有一种更简单的方法可以使用LINQ实现这一点。因此,考虑到以下输入: var input = new List<bool> { false, false, true, // first true true, false, true, // last true false }; 这将在最坏的情况下

我有一个列表,其中我想剪切第一个真值之前的所有假值,以及最后一个真值之后的所有假值

我知道我可以从每个方向做一个循环。我只是好奇,是否有一种更简单的方法可以使用LINQ实现这一点。

因此,考虑到以下输入:

var input = new List<bool>
{
    false,
    false,
    true, // first true
    true,
    false,
    true, // last true
    false
};
这将在最坏的情况下迭代列表两次,一次用于
IndexOf
调用,并且需要进行错误检查(如果输入中没有
true
怎么办?)

如果你坚持LINQ,它会变得更难,因为功能性的prorgaming一次只处理集合中的单个项目,而不考虑集合的整体。因此,在评估每个列表项是否包含它们时,您需要在列表中继续向前扫描(以防第一个
false
停止搜索):

因此,考虑到这一输入:

var input = new List<bool>
{
    false,
    false,
    true, // first true
    true,
    false,
    true, // last true
    false
};
这将在最坏的情况下迭代列表两次,一次用于
IndexOf
调用,并且需要进行错误检查(如果输入中没有
true
怎么办?)

如果你坚持LINQ,它会变得更难,因为功能性的prorgaming一次只处理集合中的单个项目,而不考虑集合的整体。因此,在评估每个列表项是否包含它们时,您需要在列表中继续向前扫描(以防第一个
false
停止搜索):


假设您的输入如下:

var values= new List<bool>()
        { false, false,
          true, false, false ,true, false, true, //this is the part you want
          false, false, false};
如果您确实想使用LINQ,但不想担心外观问题,那么可以使用
SkipWhile()
将所有内容跳过到第一个
true
,然后颠倒列表,然后再使用
SkipWhile()
跳过到第一个
true

if (values.Contains(true)) //check if there is actually at least one true.
{
    var result = values.SkipWhile(x => !x).Reverse().SkipWhile(x => !x);
};

假设您的输入如下:

var values= new List<bool>()
        { false, false,
          true, false, false ,true, false, true, //this is the part you want
          false, false, false};
如果您确实想使用LINQ,但不想担心外观问题,那么可以使用
SkipWhile()
将所有内容跳过到第一个
true
,然后颠倒列表,然后再使用
SkipWhile()
跳过到第一个
true

if (values.Contains(true)) //check if there is actually at least one true.
{
    var result = values.SkipWhile(x => !x).Reverse().SkipWhile(x => !x);
};
SkipWhile()
TakeWhile()
,阅读,尝试搜索。演示您的问题确实会有帮助。
list.GetRange(list.IndexOf(true),list.LastIndexOf(true)-list.IndexOf(true))
SkipWhile()
TakeWhile()
,阅读,尝试搜索。演示您的问题将非常有帮助。
list.GetRange(list.IndexOf(true)、list.LastIndexOf(true)-list.IndexOf(true))