C# 两个列表字符串的每次并行迭代

C# 两个列表字符串的每次并行迭代,c#,list,foreach,C#,List,Foreach,假设我有两张单子。这些是根据读取文本文件的结果填充的 列表所有者包含: cross jhill bbroms Chris Cross Jack Hill Bryan Broms 名单包括: cross jhill bbroms Chris Cross Jack Hill Bryan Broms 在从SQL源读取期间,SQL语句包含一个连接。。。我会表演 if(sqlReader["projects.owner"] == "something in owner list" || s

假设我有两张单子。这些是根据读取文本文件的结果填充的

列表所有者包含:

cross
jhill
bbroms
Chris Cross
Jack Hill
Bryan Broms
名单包括:

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,但不确定在我的情况下,这是否是一条更可取的路线。

假设两个列表的计数相同,则循环遍历两个列表:

    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
    }

此列表最好表示为一个列表,将两个列表值配对在一个列表中。

有几个选项可供选择。最不痛苦的是普通的旧for loop:

或者,如果直接使用枚举器,则可以枚举这两个集合:

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
    }
}

根据您所描述的,您根本不需要迭代

这就是您需要的:

用法:

if ((listAlpga.contains(resultA) || (listBeta.contains(resultA)) {
   // do your operation
}
列表迭代将在contains方法内隐式发生。这是2n个比较,而嵌套迭代是n*n


如果你需要一个接一个地在每个列表中进行顺序迭代,你会感觉更好。

如果你需要成对的列表或如果你需要组合列表,可以选择同时迭代两个列表。

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

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

迭代两个列表是否意味着只比较alpha中的第一个项目和beta中的第一个项目,然后比较第二个项目和第二个项目,依此类推?如果是这样的话,就使用一个常规的for循环。您考虑过只使用LINQ的.Contains吗?比如“alpha.Containsresult[chestA.item]”或者我误解了你的支票?看起来根本不需要筑巢。也许你会有两个循环在一行,但这只是O2*n,它仍然是开着的。这感觉需要一些澄清。你有两个相同大小的列表,你想用它们做什么?您正在从SQL源代码中读取什么?你想用你的名单做什么?你是说你得到的是一对a和B项,你想看看a是在列表alpha中还是B在列表beta中?感谢你的帮助,我添加了一些说明,希望helpsNote内部包含的内容将迭代数据结构。您不需要显式地迭代它。还要注意,如果您有一个比字符串更复杂的对象,您可以重载该对象的contain函数。或者使用FirstOrDefault,您可以使用任何您想要的谓词,然后检查结果是否为null,即未找到结果,或者在FirstOrDefault找到结果时使用它。哎呀,我正在编辑,以便在键入注释时使隐式迭代更显式。无论如何谢谢你:+1。不要让事情变得比他们需要的更复杂。