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