gpt4 book ai didi

c# 2 对于每个循环,如果一个循环有效,则另一个循环无效

转载 作者:行者123 更新时间:2023-12-02 02:06:48 26 4
gpt4 key购买 nike

我有 2 个不同的正则表达式匹配,当前使用 2 个 foreach 循环来获取匹配值。然而,目前,如果一个 foreach 有效,那么另一个则无效。

尝试1

foreach (string dir in multiTrimmed1)
{
foreach (string dir2 in multiTrimmed2)
{
var forVal2= dir.Replace("$", "").Replace(" ", "");
var forVal3 = dir2.Replace(",", "");
var parsedParams= new ParsedMethod()
{
Value1= forVal1,
Value2 = Convert.ToDecimal(forVal2),
Value3 = Convert.ToDecimal(forVal3),
Value4 = forVal4
};
MergeAllValues(parsedParams);
}
}

所以这里的问题是 multiTrimmed1 和 multiTrimmed2 各有 string[4] 。

假设 A、B、C 和 D。在我的尝试 1 中,我希望 forVal2 和 forVal3 正确地完成循环。

我的意思是,当 forVal2 是 A 时,forVal3 也是 A - 将其发送到 MergeAllValues,下一个、B 和 B - 将其发送到 MergeAllValues、下一个、C 和 C - 将其发送到 MergeAllValues,然后下一个 D 和D - 将其发送到 MergeAllValues。

目前只有一个循环有效。如果 forVal3 值更改为 A、B、C 和 D,则 forVal2 只会停止在 A。

尝试2

bool loopAgain = true;
while (loopAgain)
{
loopAgain = false;
foreach (string dir in multiTrimmed1)
{
foreach (string dir2 in multiTrimmed2)
{
var forVal2= dir.Replace("$", "").Replace(" ", "");
var forVal3 = dir2.Replace(",", "");
var parsedParams= new ParsedMethod()
{
Value1= forVal1,
Value2 = Convert.ToDecimal(forVal2),
Value3 = Convert.ToDecimal(forVal3),
Value4 = forVal4
};
MergeAllValues(parsedParams);
loopAgain = true;
break;
}
}

在这种情况下,forVal2 得到的值很好,但 forVal3 保持在 A

尝试3

bool loopAgain = true;
while (loopAgain)
{
loopAgain = false;
foreach (string dir in multiTrimmed1)
{
var forVal2= dir.Replace("$", "").Replace(" ", "");

foreach (string dir2 in multiTrimmed2)
{
var forVal3 = dir2.Replace(",", "");
var parsedParams= new ParsedMethod()
{
Value1= forVal1,
Value2 = Convert.ToDecimal(forVal2),
Value3 = Convert.ToDecimal(forVal3),
Value4 = forVal4
};
MergeAllValues(parsedParams);
loopAgain = true;
break;
}
}

仍然只有工作循环有效。我怎样才能使两者都工作?

最佳答案

您断言multiTrimmed1multiTrimmed2根据元素位置具有 1:1 关系,因此我们可以使用 .Zip :

foreach (var (dir, dir2) in multiTrimmed1.Zip(multiTrimmed2, (a,b) => (a, b)))
{
string forVal2 = dir.Replace("$", "").Replace(" ", "");
string forVal3 = dir2.Replace(",", "");
var parsedParams = new ParsedMethod()
{
Value1 = forVal1,
Value2 = Convert.ToDecimal(forVal2),
Value3 = Convert.ToDecimal(forVal3),
Value4 = forVal4
};
MergeAllValues(parsedParams);
}

Try it online

本质上,我们在这里所做的就是同时循环multiTrimmed1multiTrimmed2,以在每个位置生成ValueTuple个元素(a来自multiTrimmed1b来自multiTrimmed2)。然后我们将其分解为var (dir, dir2),以便我们可以单独访问这些值。

上面的代码出现问题的原因是,对于具体集合,例如List<T>或数组(T[]),foreach每次都会从头开始。

所以当你写这样的东西时:

foreach (var a in colA)
{
foreach (var b in colB)
{

}
}

您的意思是“对于 colA 中的每个项目,运行以下代码”(它本身也恰好包含一个循环。因此您不会同时循环两个集合,而是循环遍历外部集合(colA) ” )并且对于 colA 中的每个项目,您还将浏览 colB 中的每个项目。

Zip 的方法是从colA中获取一个项目,并从colB中获取一个项目,执行合并函数,然后生成值。然后,它从colA中取出下一个项目,并从colB中取出下一个项目并生成它们。这使您可以同时有效地循环访问两个集合。

因此,为了阐明其内部功能,您可以使用以下近似值来实现您自己的Zip方法:

public static IEnumerable<T> MyZip<T, A, B>(IEnumerable<A> eA, IEnumerable<B> eB, Func<A, B, T> mergeFunc)
{
var aEnumerator = eA.GetEnumerator(); // get an enumerator for eA
var bEnumerator = eB.GetEnumerator(); // get an enumerator for eB

// while there are more items to be read in a AND b
while (aEnumerator.MoveNext() && bEnumerator.MoveNext())
{
// execute the mergeFunction on the value from a and the value from b and store the result
T itemResult = mergeFunc(aEnumerator.Current, bEnumerator.Current);
// return the result to the caller
yield return itemResult;
}
}

Try it online

关于c# 2 对于每个循环,如果一个循环有效,则另一个循环无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68333445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com