如何在构建项目数组时获取集合中的所有元素
本文关键字:集合 元素 获取 构建 项目 数组 项目数 | 更新日期: 2023-09-27 17:58:15
我有下面的代码,它工作得很好,从类的实例属性返回一个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));
问题是,我想通过IList
(例如MyClass3
)引入一个集合,但不知道如何将集合中的所有项都放入我的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
数组中?感谢您的帮助!
EDIT:必须保留顺序(即MyClass1、MyClass2、MyClass3),因此如果我引入另一个元素MyClass4
,它必须在MyClass3
之后。原因是我正在编写一个具有特定结构的XML文档。
我怀疑你想要这样的东西:
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();