如何在 c# 中使用具有两个条件的 ForEach
本文关键字:两个 条件 ForEach | 更新日期: 2023-09-27 17:56:40
foreach (VXmlNode.VObject func in GetObjectsByPath("Function"))
{
BooleanExpression fexpr = func.GetPresenceCondition();
foreach (VXmlNode.VObject Objectparameter in func.GetObjectsByPath("Parameter") && func.GetObjectsByPath("Return"))
{
BooleanExpression parapresenceCondition = Objectparameter.GetPresenceCondition();
}
}
正如您在上面的代码中看到的,我想要这样的东西:
foreach (VXmlNode.VObject Objectparameter in func.GetObjectsByPath("Parameter") && func.GetObjectsByPath("Return"))
在我的代码中,条件不能存在于foreach
循环中,但有人可以告诉我等效的。任何人都可以就如何做到这一点提出建议吗?我正在尝试获取两个XML对象并对它们执行某些操作。任何帮助将不胜感激。谢谢。
使用 TakeWhile
从文档:
string[] fruits = { "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" };
IEnumerable<string> query =
fruits.TakeWhile((fruit, index) => fruit.Length >= index);
foreach (string fruit in query)
{
Console.WriteLine(fruit);
}
因此,您可以添加多个条件fruit.Length >= index && fruit != "banana"
你想要的是 Zip 方法
var integers = new [] { 1, 2, 3, 4 };
var strings = new [] { "one", "two", "three", "four" };
var combined = integers.Zip(strings, (n, w) => new { Number = n, Word = w });
foreach(var myObj in combined )
{
//Use it
}
你的问题是模糊的,例如 怎么能
func.GetObjectsByPath("Parameter")
是一个条件(即返回true
或false
),同时是一个集合,通过foreach
循环枚举?尽管如此,我还是建议使用 Linq 及其Where
过滤器:
var source = GetObjectsByPath("Function")
.Where(func => func.GetObjectsByPath("Parameter")) // condition on func
.SelectMany(func => func.GetObjectsByPath("Parameter")) // get all parameters flatten
.Select(prm => prm.GetPresenceCondition());
foreach (BooleanExpression parapresenceCondition in source) {
...
}
请注意,您可以根据需要放置任意数量的条件:
var source = GetObjectsByPath("Function")
.Where(func => ...) // condition on func
.Where(func => ...) // && another condition on func
.SelectMany(func => func.GetObjectsByPath("Parameter")) // get all parameters flatten
.Where(prm => ... ) // condition on parameter
....
不太确定你想做什么。代码没有任何意义。
func.GetObjectsByPath("Parameter") && func.GetObjectsByPath("Parameter")
您在&&
的两边都有相同的代码。这是对的吗?
也就是说,您可以尝试使用 LINQ SelectMany 来平展层次结构或 Zip,如 Luca 建议的那样。
更新:
您可以使用 Concat 或 Union。Zip也可以做到这一点。取决于您想要的结果。
foreach(var item in func.GetOBjectsByPath("Par1").Concat(func.GetOBjectsByPath("Par2"))
看起来你只是想在你的foreach
循环中执行语句,即
BooleanExpression parapresenceCondition = Objectparameter.GetPresenceCondition();
。对于 func.GetObjectsByPath("Parameter")
和 func.GetObjectsByPath("Return")
返回的所有元素Objectparameter
。
为此,您只需要组合(连接)两个列表并迭代结果列表,如下所示:
var parameters = func.GetObjectsByPath("Parameter");
var results = func.GetObjectsByPath("Return");
foreach (VXmlNode.VObject Objectparameter in parameters.Concat(results))
{
BooleanExpression parapresenceCondition = Objectparameter.GetPresenceCondition();
}