C# 如何遍历数组并跳过任何空项?

C# 如何遍历数组并跳过任何空项?,c#,csv,C#,Csv,我从excel文件中获取了一个csv,并将其放入数据表中。excel csv文件中的单元格是空的,当我遍历它们时,它们也会被遍历。我不想重复这些问题 foreach (DataRow datarow in sorted.Rows) { Boolean first = true; Console.Write(Environment.NewLine); foreach (var item in datarow.ItemArray) { if (item

我从excel文件中获取了一个csv,并将其放入数据表中。excel csv文件中的单元格是空的,当我遍历它们时,它们也会被遍历。我不想重复这些问题

foreach (DataRow datarow in sorted.Rows)
{
    Boolean first = true;
    Console.Write(Environment.NewLine);
    foreach (var item in datarow.ItemArray)
    {
        if (item != null)
        {
            int i = 0;
            if (first)
                first = false;
            else
                Console.Write(",");
            Console.Write(item);
        }

        else
            break;
    }
}

我已经尝试了上面的方法,但它仍然会遍历空单元格

假设该项实际上是一个字符串,使用检查查看
item
是否为null或空

foreach (DataRow datarow in sorted.Rows)
{
     Boolean first = true;
     Console.Write(Environment.NewLine);
     foreach (var item in datarow.ItemArray)
     {
          if (!string.IsNullOrEmpty((item ?? "").ToString()))
          {
               int i = 0;
               if (first)
                   first = false;
               else
                    Console.Write(",");
                   Console.Write(item);
                }
                else
                    continue;
      }
}
另外,用一个“

为什么不这样?”

// ItemArray is object[]
foreach (var item in datarow.ItemArray)
{
    if (first)
    {
        first = false;
    }
    else
    {
        // I think you are expecting to see the comma here even the previous element is empty e.g. A,B,,D (that missing C)
        Console.Write(",");
    }
    // so here we cannot guarantee "if (item is string)"
    if (item != null)
    {
        Console.Write(item.ToString());
    }
}

(我习惯用{}包装所有代码)

在JohnD answer上展开,您可以试试这个,假设您只想将字段输出到控制台:

var text = string.Empty;
foreach (DataRow datarow in sorted.Rows)
{
    var items = datarow.ItemArray
        .Where(x => ((x != null) && !string.IsNullOrEmpty(x.ToString())));
    var textJoined = string.Join(",", items);
    text += textJoined + Environment.NewLine;
}
Console.WriteLine(text);
您可能不熟悉LINQ,因此需要以下using语句:

using System.Linq;
同样,该解决方案假设您只想将值输出到控制台窗口,而不想迭代给定行的所有列。如果这是你想让我知道,我可以作出适当的修改

[编辑] 哎哟,请重新阅读您的问题,似乎您确实希望遍历每一列,因此下面是一个解决方案:

var text = string.Empty;
foreach (DataRow datarow in sorted.Rows)
{
    var items = datarow.ItemArray
        .Where(x => ((x != null) && !string.IsNullOrEmpty(x.ToString())));
    var currentLine = string.Empty;
    foreach(var item in items)
    {
        // do something with item
        // in this case append to currentLine
        currentLine += item + ",";
    }
    text += currentLine.Substring(0, currentLine.Length - 2) + Environment.NewLine;
}
Console.WriteLine(text);

如果得到相同的结果,您现在可以对每个项目执行所需操作

检查单元格是否为空,如果为空,则继续执行
continue
item.ToString()
如果为null,则抛出NullReferenceException。您可以执行类似于
(item???).ToString()
instead@ConradFrix接得好
item.ToString()
如果item为Null,则抛出NullReferenceException。您能解释一下为什么要-1我吗?错误的逻辑或其他?这不能回答问题,你只是重新格式化了代码。不!如果项目为空,原始代码将永远不会写入“,”!然后你误解了这个问题,OP想要过滤掉空项,并尝试了空条件,但没有帮助。所以,你没有回答这个问题,然后你在功能上回归了,因为现在即使项目为空,它也会打印。我的问题是这样的:2ndtolastem,emptyitem因为最后一个项目为空,我需要在2ndtolast和last go之间加逗号。我猜跳过空项是我需要做的,但idk除外
var text = string.Empty;
foreach (DataRow datarow in sorted.Rows)
{
    var items = datarow.ItemArray
        .Where(x => ((x != null) && !string.IsNullOrEmpty(x.ToString())));
    var currentLine = string.Empty;
    foreach(var item in items)
    {
        // do something with item
        // in this case append to currentLine
        currentLine += item + ",";
    }
    text += currentLine.Substring(0, currentLine.Length - 2) + Environment.NewLine;
}
Console.WriteLine(text);