在Foreach C#中的Foreach

时间:2019-03-06 02:49:04

标签: c#-4.0 foreach

在foreach内部保存foreach的值,但内部foreach将基于外部foreach。 我只想保存两个数据,但是内部foreach将基于外部foreach的Model2.SRL的值。

string[] _stpr = {"\r\n"};
string[] _slr = Model1.SRL.Split(_stpr, RemoveEmptyEntities);
string[] _chs = Model1.CHS.Split(_stpr, RemoveEmptyEntities);
foreach(string _s in _slr)
{
   Model2.SRL = _s; // Test Value : SRL-1 // TotalCount = 5
   Model2.DTL = "Detail";
   Model2.CHS = string.empty;

   functionToSave(ref transaction);
   foreach(string _c in _chs)
   {
      Model2.SRL = _s; // will base on value from outer loop
      Model2.CHS = _c; // Test Value : CHS-1
      functionToSave(ref transaction);
   }
}
commit();

执行此操作时,结果是如果多个项目,则内部foreach的最后一个值将在数据库中的所有列中。

Output Result:                          
SRL = SRL-1,    CHS = CHS-1,            
SRL = SRL-2,    CHS = CHS-1,            
SRL = SRL-3,    CHS = CHS-1,            
SRL = SRL-4,    CHS = CHS-1,            
SRL = SRL-5,    CHS = CHS-1,            
Expected Result:
SRL = SRL-1,   CHS = CHS-1
SRL = SRL-2,   CHS = CHS-2
SRL = SRL-3,   CHS = CHS-3
SRL = SRL-4,   CHS = CHS-4
SRL = SRL-5,   CHS = CHS-5

2 个答案:

答案 0 :(得分:1)

您将重点放在机制上,而不是依靠框架来为您完成苦恼

这似乎是Zip的一个很好的用例。假设您在此代码上方有一个using System.Linq;指令:

string[] _stpr = {"\r\n"};
string[] _slr = Model1.SRL.Split(_stpr, RemoveEmptyEntities);
string[] _chs = Model1.CHS.Split(_stpr, RemoveEmptyEntities);
int _counter = 0;
foreach(var _s in _slr.Zip(_chs, (first,second) => new { first, second })
{
   Model2.SRL = _s.first;
   Model2.DTL = "Detail";
   Model2.CHS = _s.second;
}
commit();

您也许可以进一步改进。例如。您似乎只有一个Model2实例,每次在循环中都可以重复使用。我曾期望像这样:

_slr.Zip(_chs, (first,second) => new WhateverModel2Is
    { SRL = first, CHS = second, DTL = "Detail" })

并在整个循环中每次使用那些实例。

答案 1 :(得分:0)

找到了答案。因为它是一个数组,所以我只添加了每行的增量计数器。

string[] _stpr = {"\r\n"};
string[] _slr = Model1.SRL.Split(_stpr, RemoveEmptyEntities);
string[] _chs = Model1.CHS.Split(_stpr, RemoveEmptyEntities);
int _counter = 0;
foreach(string _s in _slr)
{
   Model2.SRL = _s; // Test Value : SRL-1 // TotalCount = 5
   Model2.DTL = "Detail";
   Model2.CHS = _chs[_counter];
   _counter++;
}
commit();