Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# Linq查询,循环通过datatable,连接并获取索引_C#_Linq - Fatal编程技术网

C# Linq查询,循环通过datatable,连接并获取索引

C# Linq查询,循环通过datatable,连接并获取索引,c#,linq,C#,Linq,我有一个linq查询,其中有两个数据表,我将它们连接在一起,并使用.foreach和foreach中的操作数据进行循环。在foreach中循环通过时,如何获取行的行索引 我知道如何在不使用连接的情况下执行此操作,简单的方法是在linq语句之前放置一个int变量,并在foreach中递增。但我想知道是否可以在这个查询中添加。Select(Row,index)=>new{Row,index} Datatable1.AsEnumerable() .Join(Datatabl

我有一个linq查询,其中有两个数据表,我将它们连接在一起,并使用
.foreach
foreach
中的操作数据进行循环。在foreach中循环通过时,如何获取行的行索引

我知道如何在不使用连接的情况下执行此操作,简单的方法是在linq语句之前放置一个int变量,并在foreach中递增。但我想知道是否可以在这个查询中添加
。Select(Row,index)=>new{Row,index}

 Datatable1.AsEnumerable()
             .Join(Datatable2.AsEnumerable(),
                 dt1row => dt1row.Field<string>("name"),
                 dt2row => dt2row.Field<string>("name")) ,
                 (dt1row, dt2row) => new { dt1row, dt2row }).ToList()
             .ForEach(o =>
             {
                 //check if value for fields is the same in 


             });
Datatable1.AsEnumerable()
.Join(Datatable2.AsEnumerable(),
dt1row=>dt1row.Field(“名称”),
dt2row=>dt2row.Field(“名称”),
(dt1row,dt2row)=>new{dt1row,dt2row})
.ForEach(o=>
{
//检查字段的值在中是否相同
});

您可以试试这个:

 Datatable1.AsEnumerable()
           .Join(Datatable2.AsEnumerable(),
                 dt1row => dt1row.Field<string>("name"),
                 dt2row => dt2row.Field<string>("name")) ,
                 (dt1row, dt2row) => new { dt1row, dt2row })
           .Select((row, index)=> new 
                  {
                      Index=index, 
                      Dt1row = row.dt1row, 
                      Dt2row = row.dt2row
                  }).ToList()
                    .ForEach(o =>
                    {
                        //check if value for fields is the same in 
                    });
Datatable1.AsEnumerable()
.Join(Datatable2.AsEnumerable(),
dt1row=>dt1row.Field(“名称”),
dt2row=>dt2row.Field(“名称”),
(dt1row,dt2row)=>new{dt1row,dt2row})
.选择((行,索引)=>新建
{
索引=索引,
Dt1row=行。Dt1row,
Dt2row=行。Dt2row
})托利斯先生()
.ForEach(o=>
{
//检查字段的值在中是否相同
});

尽管LINQ功能强大,但它的代码却让我大吃一惊!lol:)他为什么需要一个ToList()?他需要
ToList()
,因为
ForEach()
List
的一种方法。您不能在linq查询的结果上调用它,该查询通常是
IEnumerable
。然后,他应该编写自己的ForEach公共静态IEnumerable ForEach(此IEnumerable源代码,Action Action)并在之后调用ToList(),尽管在本例中情况基本相同(可能会有一些性能上的好处,或者连接Linq表达式并仍然使用IEnumerable.{foreach(源代码中的T元素){action(元素);}return source;}@eranotzap我同意你的观点,伙计。这是一个选择。他会选择什么作为他所说问题的解决方案取决于OP。我觉得你的方法听起来很合理。不过我认为我帖子中的方法在实现上要简单一点。