Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我试图从字符串列表中删除空字符串,但奇怪的是,并不是所有的字符串都被删除_C#_List - Fatal编程技术网

C# 我试图从字符串列表中删除空字符串,但奇怪的是,并不是所有的字符串都被删除

C# 我试图从字符串列表中删除空字符串,但奇怪的是,并不是所有的字符串都被删除,c#,list,C#,List,我有一个要发送到方法的字符串列表。该方法获取列表,对其进行迭代并删除所有空字符串。在我发送的列表中,总共有7个空白字符串,但该方法似乎只删除了其中的4个 方法如下: public List<string> RemoveWhiteSpace(List<string> rawData) { for (int i = 0; i < rawData.Count; i++) { if (rawData[i].Length == 0)

我有一个要发送到方法的字符串列表。该方法获取列表,对其进行迭代并删除所有空字符串。在我发送的列表中,总共有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;
}
这是该方法的输出字符串。它无法消除3个空字符串。我测试并检查了没有被删除的字符串的索引,它们是索引: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);
    }
}

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);
或者最好注意,我们也删除空字符串

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 
    }
}

为什么不让.net为您做这项工作呢

list.RemoveAll(item => item.Length == 0);
或者最好注意,我们也删除空字符串

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=>!string.IsNullOrEmptys.ToList; 如果您只想删除空行和只有空格的行:

var newData=rawData .Where=>!string.IsNullOrWhiteSpaces.ToList;
请记住,使用此代码时,原始集合保持不变,因此您需要使用新数据进行进一步处理

另一个选项是Linq:

如果您只想删除空行:

var newData=rawData .Where=>!string.IsNullOrEmptys.ToList; 如果您只想删除空行和只有空格的行:

var newData=rawData .Where=>!string.IsNullOrWhiteSpaces.ToList;
请记住,使用此代码时,原始集合保持不变,因此您需要对newData进行进一步处理。我猜您有一些插槽具有连续的空字符串,而您的循环正在跳过其中一个–原因如下

假设您有一个包含4个字符串的列表,并且从零开始的索引1和2为空。当i=1时,它检测到一个空字符串并将其删除。问题是删除该项会将所有剩余项向上移动一个索引,因此位于索引2的项现在位于索引1。但是循环计数器前进到2,因此索引2处的项永远不会被检查

简单的解决方案是向后迭代列表:


我的猜测是,您有一些插槽具有连续的空字符串,而您的循环正在跳过其中一个插槽-原因如下

假设您有一个包含4个字符串的列表,并且从零开始的索引1和2为空。当i=1时,它检测到一个空字符串并将其删除。问题是删除该项会将所有剩余项向上移动一个索引,因此位于索引2的项现在位于索引1。但是循环计数器前进到2,因此索引2处的项永远不会被检查

简单的解决方案是向后迭代列表:


您可以简单地将removeallpredicate方法作为一个单行线使用

list.RemoveAll(s => string.IsNullOrEmpty(s)) 

您可以简单地将removeallpredicate方法作为一个一行程序使用

list.RemoveAll(s => string.IsNullOrEmpty(s)) 

致以最诚挚的问候

好的,IsNullOrWhiteSpace可能看起来太宽,例如,它将删除\t\n\r\n stringYes,我选择IsNullOrWhiteSpace的原因是他的示例中的第一个条目有两个前导空格,可能这只是复制粘贴错误。我将更新以通知每个选项。嗯,IsNullOrWhiteSpace可能显示得太宽,例如,它将删除\t\n\r\n stringYes,我选择IsNullOrWhiteSpace的原因是他的示例中的第一个条目有两个前导空格,可能这只是复制粘贴错误。我会更新每个选项哦,哇,这很有意义!谢谢你的回复哇,这很有道理!谢谢你的回复这太好了!我对C语言和编程都是新手,所以我不知道这一点。这比使用循环更有效吗?@SmAsh:这里有一个非常小的列表,效率是一个纳秒的问题;可读性才是最重要的。我希望循环是一些滴答声,这是伟大的!我对C语言和编程都是新手,所以我不知道这一点。这比使用循环更有效吗?@SmAsh:这里有一个非常小的列表,效率是一个纳秒的问题;可读性才是最重要的。我预计循环将提前几分钟