我的代码存在问题,如下例所示。
我有以下示例数据:
包含2列的DataTable
Fruits FruitGroup
Banana FG1,FG2,FG5
Apple
Melon FG1,FG6,FG11
我的预期成果必须是这样。
Fruits FruitGroup
Banana FG1
Banana FG2
Banana FG5
Apple NA
Apple NA
Apple NA
Melon FG1
Melon FG6
Melon FG11
这是我最近在StackOverflow中找到的失败尝试。
var tblfruitflat = fruitTable.Clone();
foreach (DataRow row in fruitTable.Rows)
{
string frutas = row.Field<string>("Fruit");
string frutasGroup = row.Field<string("FruitGroup").Split(',');
for (int ir = 0; ir < frutasGroup.Length; ir++)
{
var newRow = tblfruitflat.Rows.Add();
newRow.SetField("Fruits", frutas[ir]);
newRow.SetField("FruitGroup", fruitGroup.ElementAtOrDefault(ir));
}
}
不得不提的是,我的FruitGroup列中的空字符串必须为“NA”。 我迷失了如何处理这个问题。
谢谢! 代码片段感谢@Tim Schmelter
答案 0 :(得分:1)
希望这会让你的头脑在正确的空间。我没有将这些名称与您的实现完全匹配,但逻辑仍然适用。
//Work inside a for loop so you can manipulate the rows collection.
for (int i = 0; i < previousLength; i++)
{
//First, get your split values.
string[] vals = namesTable.Rows[i][0].ToString().Split(',');
//only operate on rows that were split into multiples.
if (vals.Length > 1)
{
//Add a new row for each item parsed from value string
foreach (string s in vals)
{
DataRow newRow = namesTable.NewRow();
newRow[0] = namesTable.Rows[i].ToString();
newRow[1] = s;
namesTable.Rows.Add(newRow);
}
}
}
//Remove old rows
for (int i = 0; i < previousLength; i++)
{
namesTable.Rows.RemoveAt(i);
}
答案 1 :(得分:1)
我不确定你的答案如何从一个输入行获得3行Apple,NA,但如果一行Apple行没问题,请执行以下操作:
var ans = from r in d1 from fg in r.FruitGroup.Split(',') select new { r.Fruit, FruitGroup = (fg == String.Empty) ? "NA" : fg };
如果您希望FruitGroup始终是三个项目并且需要三个Apple行,请执行以下操作:
var ans2 = from r in d1 from fg in ((r.FruitGroup == String.Empty) ? new String[3] : r.FruitGroup.Split(',')) select new { r.Fruit, FruitGroup = (String.IsNullOrEmpty(fg)) ? "NA" : fg };