Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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#_Linq_Validation_Datatable - Fatal编程技术网

C# 将数据表值(逗号分隔的值)拆分为多行

C# 将数据表值(逗号分隔的值)拆分为多行,c#,linq,validation,datatable,C#,Linq,Validation,Datatable,我的代码有问题,下面是一个例子 我有以下示例数据: 包含两列的数据表 Fruits FruitGroup Banana FG1,FG2,FG5 Apple Melon FG1,FG6,FG11 我的预期结果是这样的 Fruits FruitGroup Banana FG1 Banana FG2 Banana FG5 Apple NA A

我的代码有问题,下面是一个例子

我有以下示例数据:

包含两列的数据表

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
这是我最近一次失败的尝试,我在堆栈溢出上找到了它

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

    }
}
var tblfruitflat=fructable.Clone();
foreach(子表.Rows中的数据行)
{
字符串frutas=行字段(“水果”);

string frutasGroup=row.Field希望这会让您的头脑处于正确的位置。我没有将名称与您的实现完全匹配,但逻辑仍然适用

//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);
        }
//在for循环中工作,以便可以操作rows集合。
for(int i=0;i1)
{
//为从值字符串解析的每个项添加新行
foreach(VAL中的字符串s)
{
DataRow newRow=namesTable.newRow();
newRow[0]=namesTable.Rows[i].ToString();
newRow[1]=s;
namesTable.Rows.Add(newRow);
}
}
}
//删除旧行
for(int i=0;i
希望这会让您的头脑处于正确的位置。我没有将名称与您的实现完全匹配,但逻辑仍然适用

//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);
        }
//在for循环中工作,以便可以操作rows集合。
for(int i=0;i1)
{
//为从值字符串解析的每个项添加新行
foreach(VAL中的字符串s)
{
DataRow newRow=namesTable.newRow();
newRow[0]=namesTable.Rows[i].ToString();
newRow[1]=s;
namesTable.Rows.Add(newRow);
}
}
}
//删除旧行
for(int i=0;i
我不确定您的答案如何从一个输入行中得到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 };
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 };
如果您希望水果组始终为三个项目,并且需要三行苹果,请执行以下操作:

var ans = from r in d1 from fg in r.FruitGroup.Split(',') select new { r.Fruit, FruitGroup = (fg == String.Empty) ? "NA" : fg };
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 };

我不确定您的答案如何从一个输入行中得到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 };
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 };
如果您希望水果组始终为三个项目,并且需要三行苹果,请执行以下操作:

var ans = from r in d1 from fg in r.FruitGroup.Split(',') select new { r.Fruit, FruitGroup = (fg == String.Empty) ? "NA" : fg };
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 };

等等,什么?当你调试时会发生什么?等等,什么?当你调试时会发生什么?到目前为止,这对我来说是有效的!但是当我循环遍历这部分的数据表时
//删除以前长度和以下长度的所有记录。for(int j=0;j
它给了我一个NullExceptionError我已经修改了我的答案,以说明需要拆分的多行。我还添加了相应的注释。我将删除循环移到拆分行的循环之外,并确保添加行函数仅对拆分时导入多个数据的行操作。请允许我知道你是否需要进一步的指导!到目前为止,这对我来说是有效的。但是当我循环遍历此部分的数据表时,
//删除以前长度及以下的所有记录。对于(int j=0;j
它给了我一个NullExceptionError我已经修改了我的答案,以说明需要拆分的多行。我还添加了相应的注释。我将删除循环移到拆分行的循环之外,并确保添加行函数仅对拆分时导入多个数据的行操作。请允许我知道你是否需要进一步的指导!