两个列表字符串的并发foreach迭代

时间:2013-06-17 18:48:51

标签: c# list foreach

假设我有两个 List<string>。这些是从阅读文本文件

的结果中填充的

列表所有者包含:

cross
jhill
bbroms

列表受让人包含:

Chris Cross
Jack Hill
Bryan Broms

从SQL源读取期间(SQL语句包含连接)...我会执行

    if(sqlReader["projects.owner"] == "something in owner list" || sqlReader["assign.assignee"] == "something in assignee list")
    {
       // add this projects information to the primary results LIST
       list_by_owner.Add(sqlReader["projects.owner"],sqlReader["projects.project_date_created"],sqlReader["projects.project_name"],sqlReader["projects.project_status"]);

       // if the assignee is not null, add also to the secondary results LIST
       // logic to determine if assign.assignee is null goes here 

       list_by_assignee.Add(sqlReader["assign.assignee"],sqlReader["projects.owner"],sqlReader["projects.project_date_created"],sqlReader["projects.project_name"],sqlReader["projects.project_status"]);
    }

我不想最终使用嵌套的foreach。

FOR循环可能就足够了。有人向我提到了ZIP,但不确定这是否适合我的情况。

6 个答案:

答案 0 :(得分:2)

迭代两个列表的一个循环(假设两个具有相同的计数):

    for (int i = 0; i < alpha.Count; i++)
    {
        var itemAlpha = alpha[i] // <= your object of list alpha
        var itemBeta = beta[i] // <= your object of list beta
        //write your code here
    }

答案 1 :(得分:2)

根据您的描述,您根本不需要进行迭代。

这就是你需要的: http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

用法:

if ((listAlpga.contains(resultA) || (listBeta.contains(resultA)) {
   // do your operation
}

列表迭代将在contains方法中隐式发生。那就是2n比较,而n * n则是嵌套迭代。

如果你需要走这条路,那么你会在每个列表中一个接一个地进行顺序迭代会更好。

答案 2 :(得分:1)

这个列表可能更好地表示为List<KeyValuePair<string, string>>,它将两个列表值组合在一个列表中。

答案 3 :(得分:1)

有几种选择。最简单的“痛苦”将是普通的for循环:

for (var index = 0; index < alpha.Count; index++)
{
    var alphaItem = alpha[index];
    var betaItem = beta[index];

    // Do something.
}

另一个有趣的方法是使用索引的LINQ方法(但是你需要记住它们被懒惰地评估,你必须使用得到的可枚举),例如:

alpha.Select((alphaItem, index) => 
{
    var betaItem = beta[index];

    // Do something
})

如果您直接使用枚举器,也可以枚举这两个集合:

using (var alphaEnumerator = alpha.GetEnumerator())
using (var betaEnumerator = beta.GetEnumerator())
{
    while (alphaEnumerator.MoveNext() && betaEnumerator.MoveNext())
    {
        var alphaItem = alphaEnumerator.Current;
        var betaItem = betaEnumerator.Current;

        // Do something
    }
}

答案 4 :(得分:0)

Zip(如果您需要配对)或Concat(如果您需要组合列表)是可以同时迭代2个列表的选项。

答案 5 :(得分:0)

我喜欢做这样的事情来枚举并行列表:

int alphaCount = alpha.Count ;
int betaCount  = beta.Count  ;
int i = 0 ;

while ( i < alphaCount && i < betaCount )
{
  var a = alpha[i] ;
  bar b = beta[i] ;
  // handle matched alpha/beta pairs
  ++i ;
}

while ( i < alphaCount )
{
  var a = alpha[i] ;
  // handle unmatched alphas
  ++i ;
}

while ( i < betaCount )
{
  var b = beta[i] ;
  // handle unmatched betas
  ++i ;
}
相关问题