如何在构建项目数组时获取集合中的所有元素?

时间:2013-02-08 13:58:05

标签: c# linq

我有以下代码可以很好地返回类中实例属性的XElement对象:

public MyClass1 MyClass1 {get; set;}
public MyClass2 MyClass2 {get; set;}

var elements = new[]
{
   //Calls to .GetXML() return an XElement instance
   this.MyClass1.GetXML(),
   this.MyClass2.GetXML()
};

return new XElement("Root",
    elements.Where(el => el != null && !el.IsEmpty));

问题是,我想通过IListMyClass3介绍一个集合,并且不知道如何将集合中的所有项目都放到我的elements数组中。所以我现在想要以下内容:

public MyClass1 MyClass1 {get; set;}
public MyClass2 MyClass2 {get; set;}
public IList<MyClass3> MyClass3 {get; set;}

var elements = new[]
{
   this.MyClass1.GetXML(),
   this.MyClass2.GetXML(),
   this.MyClass3.ToList().Select(x => x.GetXML())  //Not working
};

我尝试使用Select的组合,甚至将IList更改为List只是为了查看.ForEach是否有效,而不是IList。我得到的错误是:“找不到隐式类型数组的最佳类型”,无论我尝试哪种方法。

如何将elements属性实例中的所有元素都放到MyClass4数组中?感谢任何帮助,谢谢!

编辑:订单必须保留(即MyClass1,MyClass2,MyClass3),所以如果我引入另一个元素MyClass3,它必须在{{1}之后}}。原因是因为我正在编写一个具有特定结构的XML文档。

1 个答案:

答案 0 :(得分:2)

我怀疑你想要这样的东西:

var elements = new[] { MyClass1.GetXML(), MyClass2.GetXML() }
      .Concat(MyClass3.Select(x => x.GetXML())
      .ToArray();

在MyClass3之后使用MyClass4:

var elements = new[] { MyClass1.GetXML(), MyClass2.GetXML() }
      .Concat(MyClass3.Select(x => x.GetXML())
      .Concat(new[] { MyClass4.GetXML() })
      .ToArray();

或将GetXML放在一个地方:

// Relies on covariance in .NET 4
var elements = new MyBase[] { MyClass1, MyClass2 }
    .Concat(MyClass3)
    .Concat(new[] { MyClass4 })
    .Select(x => x.GetXML())
    .ToArray();

或者根本没有使用LINQ直到结束:

var items = new List<BaseClass>();
items.Add(MyClass1);
items.Add(MyClass2);
items.AddRange(MyClass3);
items.Add(MyClass4);
var elemets = items.Select(x => x.GetXML()).ToArray();