如何在列表中的最后一个负值之后获得正值?

Kir*_*shi 9 c#

我想要在最后一个负值之后的所有正整数值.
以下是Integer值列表:

List<int> lst = new List<int>();
lst.Add(1);
lst.Add(3);
lst.Add(5);
lst.Add(-3);
lst.Add(4);
lst.Add(-4);
lst.Add(5);
lst.Add(6);
Run Code Online (Sandbox Code Playgroud)

我试过

lst.Skip(lst.Max(0, lst.Count - 1)).ToList();
Run Code Online (Sandbox Code Playgroud)

预期产出

Last positive values after last negative value:  
in example list last negative value is -4
and last positive values are 5, 6,
So I want 5 and 6 from given list
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 13

因为它是一个你可以使用的列表 FindLastIndex

int index = lst.FindLastIndex(i => i < 0); // it's value is lst[index]
IEnumerable<int> allPositiveAfterLastNegative = lst.Skip(index + 1);
Run Code Online (Sandbox Code Playgroud)

这也处理没有负值或者在开头或结尾的情况.


juh*_*arr 8

要获得上一次否定后的所有值,您可以执行此操作

var positivesAfterLastNegative = lst.Reverse().TakeWhile(x => x >= 0).Reverse().ToList()
Run Code Online (Sandbox Code Playgroud)

基本上,从结束开始直到它找到负数然后反转结果,以便它们以正确的顺序返回.

注意:我只建议使用列表或数组执行此操作.对于需要迭代才能达到目的的东西,它会有糟糕的表现.在这种情况下,您可以执行以下操作.

List<int> results = new List<int>();
foreach(var item in lst)
{
    if(item < 0)
    {
        results.Clear();
    }
    else
    {
        results.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将向列表添加非负值,直到它达到负值,然后它将清除列表,从而仅产生最后一个负值之后的值.

如果您更喜欢非Linq解决方案,那么您可以执行此操作

List<int> results = new List<int>();
for(int i = lst.Count - 1; i >= 0; i--)
{
    if(lst[i] < 0)
    {
        break;
    }

    results.Insert(0,item);
}    
Run Code Online (Sandbox Code Playgroud)

  • _"只建议使用列表或数组执行此操作.对于需要迭代才能结束的事情,它会有不良表现"_即使使用列表或数组,第二个`Reverse`也将应用于查询和不是集合.如果需要,它也不会返回最后的负值 (4认同)

eoc*_*ron 5

这里有一张班轮:

var result = list.Reverse().TakeWhile(x=> x > 0).Reverse().ToList();
Run Code Online (Sandbox Code Playgroud)