我正在删除整数列表中最右边的零(它们只能是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。请注意,作为问题一部分的“效率”是一个客观标准,而不是基于意见。)
答案 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');