C# 检测列中的多个值。然后遍历这些值

C# 检测列中的多个值。然后遍历这些值,c#,linq,C#,Linq,感谢您在advanced中提出的想法。我不确定是否有办法,但值得一试 下面您将看到我将引用的代码。我创建的代码非常有效;但是,当循环复制到dtPeople时,t.Field(“Source”)中有多个值(逗号分隔和引号)。我需要循环遍历这些值,创建一个新行,该行具有相同的信息,只是将有一个不同的t.Field(“Source”) 需要它像这样出来: "999999","060","100110257","Billy",,"Bob","bb@test.org" "999999","168","10

感谢您在advanced中提出的想法。我不确定是否有办法,但值得一试

下面您将看到我将引用的代码。我创建的代码非常有效;但是,当循环复制到
dtPeople
时,
t.Field(“Source”)
中有多个值(逗号分隔和引号)。我需要循环遍历这些值,创建一个新行,该行具有相同的信息,只是将有一个不同的
t.Field(“Source”)

需要它像这样出来:

"999999","060","100110257","Billy",,"Bob","bb@test.org"
"999999","168","100110265","Joe",,"Shmo","js@test.org"
"999999","168","101912217","Joe",,"Shmo","js@test.org"

您可以使用
SelectMany
Source
投影到多个项目中:

var dtPeople = new DataTable();
tempDtUsers.AsEnumerable()
    .Where(t => t.Field<string>("role").ToLower() == "user")
    .Select(t => new
    {
        Id,
        SourcedIds = t.Field<string>("SourcedIds").Substring(6),
        Source = t.Field<string>("Source"),
        FName = t.Field<string>("FName"),
        MName = "",
        LName = t.Field<string>("LName"),
        Email = t.Field<string>("Email")
    })
    .SelectMany(x => x.Source.Split(',').Select(source => dtPeople.LoadDataRow(new[]
    {
        x.Id,
        x.SourcedIds,
        source,
        x.FName,
        x.MName,
        x.LName,
        x.Email
    }, false)))
    .CopyToDataTable();
var dtPeople=new DataTable();
tempDtUsers.AsEnumerable()
.Where(t=>t.Field(“角色”).ToLower()=“用户”)
.选择(t=>new
{
身份证件
SourcedIds=t.字段(“SourcedIds”).子字符串(6),
Source=t.字段(“Source”),
FName=t.Field(“FName”),
MName=“”,
LName=t.字段(“LName”),
电子邮件=t.Field(“电子邮件”)
})
.SelectMany(x=>x.Source.Split(',).Select(Source=>dtPeople.LoadDataRow(new[]
{
x、 身份证,
x、 资料来源:,
来源:,
x、 FName,
x、 MName,
x、 名字,
x、 电子邮件
},false)))
.CopyToDataTable();

Edit:CopyToDataTable仅接受T:DataRow中的IEnumerable。我认为
T
可以是任何类…

您可以使用
SelectMany
Source
投影到多个项目中:

var dtPeople = new DataTable();
tempDtUsers.AsEnumerable()
    .Where(t => t.Field<string>("role").ToLower() == "user")
    .Select(t => new
    {
        Id,
        SourcedIds = t.Field<string>("SourcedIds").Substring(6),
        Source = t.Field<string>("Source"),
        FName = t.Field<string>("FName"),
        MName = "",
        LName = t.Field<string>("LName"),
        Email = t.Field<string>("Email")
    })
    .SelectMany(x => x.Source.Split(',').Select(source => dtPeople.LoadDataRow(new[]
    {
        x.Id,
        x.SourcedIds,
        source,
        x.FName,
        x.MName,
        x.LName,
        x.Email
    }, false)))
    .CopyToDataTable();
var dtPeople=new DataTable();
tempDtUsers.AsEnumerable()
.Where(t=>t.Field(“角色”).ToLower()=“用户”)
.选择(t=>new
{
身份证件
SourcedIds=t.字段(“SourcedIds”).子字符串(6),
Source=t.字段(“Source”),
FName=t.Field(“FName”),
MName=“”,
LName=t.字段(“LName”),
电子邮件=t.Field(“电子邮件”)
})
.SelectMany(x=>x.Source.Split(',).Select(Source=>dtPeople.LoadDataRow(new[]
{
x、 身份证,
x、 资料来源:,
来源:,
x、 FName,
x、 MName,
x、 名字,
x、 电子邮件
},false)))
.CopyToDataTable();

Edit:CopyToDataTable仅接受T:DataRow中的IEnumerable。我想
T
可以是任何一个类…

谢谢你的评论。我只是在了解林克。我以前从来没有这样写过。我收到一个“匿名类型”错误,不知道为什么。Id是一个变量字符串,在填充tempDtUsers之前已经可用。因此,当它循环通过时,它不会从tempDtUsers获得它。希望老师会说我是lambda Expressions的新手。根据您提供的信息,很难猜测错误是什么。您能否复制准确的错误消息并粘贴到此处,并指出错误来自哪一行?而且,很抱歉回复太晚。@54696d用“匿名类型”解决了这个问题。你真棒!我现在要留出一些时间学习lambda。谢谢谢谢你的评论。我只是在了解林克。我以前从来没有这样写过。我收到一个“匿名类型”错误,不知道为什么。Id是一个变量字符串,在填充tempDtUsers之前已经可用。因此,当它循环通过时,它不会从tempDtUsers获得它。希望老师会说我是lambda Expressions的新手。根据您提供的信息,很难猜测错误是什么。您能否复制准确的错误消息并粘贴到此处,并指出错误来自哪一行?而且,很抱歉回复太晚。@54696d用“匿名类型”解决了这个问题。你真棒!我现在要留出一些时间学习lambda。谢谢
var dtPeople = new DataTable();
tempDtUsers.AsEnumerable()
    .Where(t => t.Field<string>("role").ToLower() == "user")
    .Select(t => new
    {
        Id,
        SourcedIds = t.Field<string>("SourcedIds").Substring(6),
        Source = t.Field<string>("Source"),
        FName = t.Field<string>("FName"),
        MName = "",
        LName = t.Field<string>("LName"),
        Email = t.Field<string>("Email")
    })
    .SelectMany(x => x.Source.Split(',').Select(source => dtPeople.LoadDataRow(new[]
    {
        x.Id,
        x.SourcedIds,
        source,
        x.FName,
        x.MName,
        x.LName,
        x.Email
    }, false)))
    .CopyToDataTable();