如何在 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对象并对它们执行某些操作。任何帮助将不胜感激。谢谢。

如何在 c# 中使用具有两个条件的 ForEach

使用 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")

是一个条件(即返回truefalse),同时是一个集合,通过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();
}