-1

假设我有两个 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,但不确定在我的情况下这是否是一个更可取的途径。

4

6 回答 6

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
    }
于 2013-06-17T18:53:34.340 回答
2

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

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

用法:

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

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

如果您需要走那条路线,那么您最好在每个列表中一个接一个地进行顺序迭代。

于 2013-06-17T18:57:44.610 回答
1

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

于 2013-06-17T18:54:09.353 回答
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
    }
}
于 2013-06-17T18:56:33.287 回答
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 ;
}
于 2013-06-17T19:21:48.497 回答
0

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

于 2013-06-17T18:58:31.310 回答