如何遍历对象数组并将这些值传递到foreach循环之外?

时间:2015-04-21 01:10:09

标签: c# arrays loops foreach

这可能不是我最清楚的问题但是我们走了。我有一个实例化对象的类。此对象通过一系列方法运行,并从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());

3 个答案:

答案 0 :(得分:3)

在循环之前,请设置List来存储对象:

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

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

fqrs.Add(objCodeFqr);

在循环之后,您可以访问fqrs[0]fqrs[1],或使用其他foreach循环播放。

答案 1 :(得分:0)

我没有真正理解代码,但从问题中的描述看,似乎也可以使用关键字&#34; yield&#34;

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"
    }
}

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

答案 2 :(得分:0)

foreach循环中还有回收率。我猜这些类型因为它们非常清楚。

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