热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#2为每个循环,如果一个工作另一个不

c#我有2个不同的正则表达式匹配项,目前使用2个foreach循环来获取匹配值。但是,就目前而言,如果一个foreach有效,则另一个无效。

c#

我有 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);
}

网上试试

本质上,我们在这里所做的是同时循环遍历multiTrimmed1并在每个位置(from和from )multiTrimmed2生成一个ValueTuple元素。然后我们将其分解,以便我们可以单独访问这些值。amultiTrimmed1bmultiTrimmed2var (dir, dir2)

您上面的代码出现问题的原因是,对于具体的集合,例如List或 数组 ( 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 MyZip(IEnumerable eA, IEnumerable eB, Func 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;
}
}

网上试试






推荐阅读
  • 可空类型可空类型主要用于参数类型声明和函数返回值声明。主要的两种形式如下: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • 本文介绍了如何对PHP二维数组进行排序以及如何获取最大值。同时还提到了在数据分析系统中使用排序的实例,以及如何统计角色等级和创建角色总数。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 本文介绍了如何使用OpenXML按页码访问文档内容,以及在处理分页符和XML元素时的一些挑战。同时,还讨论了基于页面的引用框架的局限性和超越基于页面的引用框架的方法。最后,给出了一个使用C#的示例代码来按页码访问OpenXML内容的方法。 ... [详细]
  • PatchODAX8: ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有