循环收集

时间:2010-04-05 11:57:50

标签: c#

我有两个班级

class A
{
    public string something { get; set; }
    public IList<B> b= new List<B>();
}

class B
{
    public string else { get; set; }
    public string elseelse { get; set; }
}

我填充了一个叫做obj的A类对象。如何遍历此对象并打印值。我是否必须使用两个foreach,就像这里的一个节目一样,还是有更好的方式?

 foreach (var z  in obj)
            {
                // print z.something;
                foreach (var x in z.b)
                {
                    // print x.elseelse;
                }
            }

4 个答案:

答案 0 :(得分:2)

我的问题对我来说有点不清楚。我假设你有一些对象的集合 A A 有一个集合属性。如果是这样的话:

你的解决方案是最直接的方式所以我会选择它。

可以使用linq,但它不会真正使这更快或更清楚。类似于SelectMany的东西,它将许多IEnumerables压缩成一个:

foreach(var x in obj.SelectMany(z=>z.b)) { }

答案 1 :(得分:2)

由于只有一个集合,因此不需要两个循环。由于您的obj变量不是集合,因此您甚至无法对其进行循环。

只需在对象中显示属性并循环遍历集合:

// print obj.something; 
foreach (var x in obj.b) {
  // print x.else; 
  // print x.elseelse; 
} 

答案 2 :(得分:2)

var qry = from z in obj
          from x in z.b
          select new { z, x };
foreach (var pair in qry)
{
     Console.WriteLine("{0}, {1}", pair.z.something, pair.x.elseelse);
}

var qry = from z in obj
          from x in z.b
          select new { z.zomething, x.elseelse };
foreach (var item in qry)
{
     Console.WriteLine("{0}, {1}", item.something, item.elseelse);
}

或投射字符串:

var qry = from z in obj
          from x in z.b
          select z.zomething + ", " + x.elseelse;
foreach (string s in qry)
{
     Console.WriteLine(s);
}

答案 3 :(得分:1)

不,只有一个foreach通过obj.b:

foreach (var z in obj.b)
{
}