【问题标题】:How to iterate through an object array and pass those values outside of the foreach loop?如何遍历对象数组并将这些值传递到 foreach 循环之外?
【发布时间】:2015-04-21 01:10:09
【问题描述】:

这可能不是我最清楚的问题,但我们开始吧。我有一个实例化对象的类。该对象通过一系列方法运行,并从 Web 服务 dll 中调用一些值。这是我的问题。被拉入对象数组的两个字符串必须通过 foreach 循环,以便将它们传递给另一个方法。

我不知道如何捕获 foreach 循环的结果并将它们传递到循环之外以便我可以处理它们。

本质上,我试图遍历一个对象数组并在 foreach 循环中挑选出每个对象,然后我想将这两个对象传递出去,以便我可以将它们传递给方法。

我能够将每个对象键入一个字符串,连接字符串,然后将字符串传递到循环之外。然后我可以使用 split 方法来拆分字符串,但是它们现在是字符串并且不再是对象,因此我的方法不再起作用。我在这里束手无策,任何建议都会很棒......

这里是有问题的代码摘录

JciFqr objRootFqr = objClient.CreateFqr("SIPE-NAE-001", "Programming.CommonPath", JciFqr.Classifications.Folder, JciFqr.Types.Folder);

JciFqr[] aobjRoomFqrs = await objClient.GetObjectsAsync(objRootFqr, CancellationToken.None);

foreach(JciFqr objFqr in aobjRoomFqrs)
{
    System.Console.WriteLine(objFqr);
    JciFqr objCodeFqr = JciFqr.Create(objFqr, "Code_Blue", JciFqr.Classifications.Object, JciFqr.Types.BinaryValue);
    await objClient.WritePropertyAsync(objCodeFqr, "Present Value", a_bOn ? "on" : "off", CancellationToken.None);
    System.Console.WriteLine(objCodeFqr);

    //await objClient.ReadPropertyAsync(objCodeBlueFqr, "Present Value", a_bOn ? "on" : "off", CancellationToken.None);
    var obj = objCodeFqr ;
    fqrs = obj + "|" + fqrs;

    count++;
}

Console.WriteLine(count);
Console.WriteLine(fqrs);

string[] fqrArray = fqrs.Split('|');
for (int i = 0; i < fqrArray.Length; i++)
{
    Console.WriteLine(fqrArray[i]);
}

string strStatus = "";
string uri1 = fqrArray[0];
string uri2 = fqrArray[1];

bool triggerCodeBlue = false;

Console.WriteLine("Trigger the Code");
triggerCodeBlue = bool.Parse(Console.ReadLine());

【问题讨论】:

  • 第 1 步:正确格式化您的代码
  • 我很好奇...什么是“Fqr” :D 的缩写或首字母缩略词
  • 完全合格的参考

标签: c# arrays loops foreach


【解决方案1】:

在你的循环之前,创建一个List 来存储你的对象:

List<JciFqr> fqrs = new List<JciFqr>();

在循环中,将对象存储在列表中:

fqrs.Add(objCodeFqr);

循环之后,您可以访问fqrs[0]fqrs[1],或者与另一个foreach 循环。

【讨论】:

  • 非常漂亮,谢谢。我正在学习 C#,因为我来自纯粹的 LAMP 背景
【解决方案2】:

我并没有真正理解代码,但从问题中的描述来看,似乎也可以使用关键字“yield”

yield 函数允许您从循环中逐一返回值,并将这些结果转换为可枚举,例如:

static IEnumerable<string> Combinations(string input){
    for(int i=0;i<input.length-1; i++){
        for(int j=0;j<input.length; j++){
            yield return input[i].ToString() + input[j].ToString();
        }
    }
}

static void Main(string[] args)
{
    foreach (string output in Combinations("abc")){
        Console.WriteLine(output); //outputs "ab", "ac", "bc"
    }
}

从算法上讲,产生结果与将它们添加到列表并返回列表相同,但是当您产生大量结果时可以使用更少的内存。

【讨论】:

  • 我无法将值键入字符串,它们必须作为对象保留,否则会破坏方法。
  • 你可以产生任何类型的结果,带有字符串的代码只是一个例子
  • 不同之处在于你的函数会产生一个 IEnumerable 而不是 IEnumerable
【解决方案3】:

在你的 foreach 循环中也有 yield return。我在猜测类型,因为它们非常清楚。

IEnumerable<Tuple<JciFqr, JciFqr>> GetStuff() {
    foreach(JciFqr objFqr in aobjRoomFqrs){
        JciFqr objCodeFqr = JciFqr.Create(objFqr, "Code_Blue", JciFqr.Classifications.Object, JciFqr.Types.BinaryValue);
        await objClient.WritePropertyAsync(objCodeFqr, "Present Value", a_bOn ? "on" : "off", CancellationToken.None);
        yield return Tuple.Create(objFgr, objCodeFgr);   
    }
}

您可以像这样枚举从函数返回的集合:

foreach(var pair in GetStuff()){
    //do other stuff here
    Console.WriteLine(string.format("Item1: {0}, Item2: {1}", pair.Item1, pair.Item2));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2022-01-19
    • 2017-06-07
    • 2018-07-26
    • 2019-03-06
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多