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。不要让事情变得比他们需要的更复杂。