如何解决我正在尝试从字符串列表中删除空字符串,但是很奇怪,并非所有的字符串都被删除了
我有要发送给该方法的字符串列表。该方法获取列表,对其进行迭代并删除所有空字符串。在我发送的列表中,总共有7个空白字符串,但是该方法似乎只删除了其中的4个。
这是方法:
public List<string> RemoveWhiteSpace(List<string> rawData)
{
for (int i = 0; i < rawData.Count; i++)
{
if (rawData[i].Length == 0)
{
rawData.RemoveAt(i);
}
}
return rawData;
}
这是直接从控制台复制的列表本身:
@0
D=M
@1
D=D-M
@10
D;JGT
@1
D=M
@12
0;JMP
@0
D=M
@2
M=D
@14
0;JMP
这是方法的输出字符串。它无法消除3个空字符串。我测试并检查了未删除的字符串的索引,它们分别是index:4,5和6。我还检查了这些字符串的长度,实际上它们是0。我不明白问题出在哪里
@0
D=M
@1
D=D-M
@10
D;JGT
@1
D=M
@12
0;JMP
@0
D=M
@2
M=D
@14
0;JMP
解决方法
RemoveAt删除当前索引,因此要删除的索引后面的所有元素的索引都会减少。
如果要避免这种情况,可以从列表末尾开始:
for (int i = rawData.Count - 1; i >= 0; i--)
{
if (rawData[i].Length == 0)
{
rawData.RemoveAt(i);
}
}
,
为什么不让.net为您完成工作?
list.RemoveAll(item => item.Length == 0);
或更妙的是(请注意,我们也删除了null
个字符串)
list.RemoveAll(item => string.IsNullOrEmpty(item));
编辑:要修复当前循环,请执行以下操作:
for (int i = 0; i < rawData.Count;) // don't increment here
{
if (rawData[i].Length == 0)
{
rawData.RemoveAt(i);
}
else
{
i++; // but here
}
}
,
另一种选择是Linq:
如果您想摆脱空行:
var newData = rawData
.Where(s => !string.IsNullOrEmpty(s)).ToList();
如果您想摆脱空行和只有空格的行:
var newData = rawData
.Where(s => !string.IsNullOrWhiteSpace(s)).ToList();
请记住,使用此代码,原始集合保持不变,因此您需要使用newData
我的猜测是您有一些带有连续空字符串的“插槽”,并且循环正在跳过其中的一个-这就是原因。
假设您有一个包含4个字符串的列表,并且(从零开始)索引1和2为空。当i = 1时,它将检测到空字符串并将其删除。问题 是,删除项目会将所有剩余项目上移一个索引,因此索引2处的项目现在位于索引1。但是循环计数器前进到2,因此索引处的项目从未检查2。
简单的解决方案是迭代列表向后:
for (int i=rawData.Count - 1 ; i >= 0 ; i--)
{
if (rawData[i].Length==0)
{
rawData.RemoveAt(i);
}
}
,
您可以简单地使用removeall(predicate)方法作为单行。
list.RemoveAll(s => string.IsNullOrEmpty(s))
最诚挚的问候
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。