有效删除整数列表中的最后一个零(c#或vb.net)

时间:2014-04-08 17:04:01

标签: c# vb.net list trim

我正在删除整数列表中最右边的零(它们只能是0或1),如下所示:

For i As Integer = Product.Count - 1 To 0 Step -1
    If Product(i) = 0 Then
        Product.RemoveAt(i)
    Else
        Exit For
    End If
Next

你能否建议一个解决方案不那么尴尬,而且可能更有效率。

如果可能的话,如果列表仅包含1 0和1,我还希望看到另一种保留1 0的解决方案。谢谢(语言,vb.net的c#是无关紧要的)。

(PS。请注意,作为问题一部分的“效率”是一个客观标准,而不是基于意见。)

4 个答案:

答案 0 :(得分:3)

如果值只能是0或1,您可以搜索最后1并删除之后的所有内容。

    Dim index As Integer
    index = Product.LastIndexOf(1) + 1
    Product.RemoveRange(index, Product.Count - index)

如果列表只包含0,则索引将等于0,因此您可以在RemoveRange之前添加if语句。

    Dim index As Integer
    index = Product.LastIndexOf(1) + 1
    If index = 0 Then index = 1
    Product.RemoveRange(index, Product.Count - index)

(如果列表中没有项目,可能会崩溃)

<强>更新

由于它搜索1,因此第一个0的索引将是返回+1的索引。这也解决了函数返回-1的问题,当它全部为零时。

答案 1 :(得分:1)

我不确定它更优雅,但确实使用LINQ!

int lastOne = i.IndexOf(i.Last(n => n == 1));
List<int> trimmedList = i.Take(lastOne + 1); //Account for zero-based index

要获得单个零,我会使用LastOrDefault

int lastOne = i.IndexOf(i.LastOrDefault(n => n == 1));
List<int> trimmedList = i.Take(lastOne + 1); //Account for zero-based index

到目前为止最酷的&#34; LINQ方法,由Alexi Levenkov建议:

Reverse().SkipWhile(i=> i==0).Reverse();

这将删除单个零的情况,在这种情况下我将使用三元:

i.All(n => n == 0) ? i.Take(1) : i.Reverse().SkipWhile(i=> i==0).Reverse();

答案 2 :(得分:1)

我会这样做:

public void RemoveTrailingZeros( List<int> digits )
{
  int i = digits.Count ;
  while ( --i >= 0 && digits[i] == 0 )
  {
    digits.RemoveAt(i) ;
  }
  return ;
}

更整洁:

static void RemoveTrailingZeroes( List<int> digits )
{
  int i = 1 + digits.FindLastIndex( x => x != 0 ) ;
  digits.RemoveRange(i,digits.Count-i) ;
  return ;
}

答案 3 :(得分:-2)

修剪:)

Product.TrimEnd('0');