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

时间:2016-05-23 16:12:52

标签: 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 != null)
        {
            int i = 0;
            if (first)
                first = false;
            else
                Console.Write(",");
            Console.Write(item);
        }

        else
            break;
    }
}

我已经尝试了上面的内容,它仍然遍历空单元格。

4 个答案:

答案 0 :(得分:1)

扩展JohnD答案,您可以尝试这一点,假设您只想将字段输出到控制台

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 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);

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

答案 1 :(得分:0)

假设该项目确实是一个字符串,请使用String.IsNullOrEmpty()检查item是空还是空。

if (item != null && !String.IsNullOrEmpty(item.ToString()))

此外,将break语句替换为continue

答案 2 :(得分:-1)

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

答案 3 :(得分:-1)

为什么不喜欢这个?

// 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());
    }
}

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