C# 如何遍历数组并跳过任何空项?
我从excel文件中获取了一个csv,并将其放入数据表中。excel csv文件中的单元格是空的,当我遍历它们时,它们也会被遍历。我不想重复这些问题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
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);