0

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問題は、たとえば forを介してコレクションを導入したいのですが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配列に取得するにはどうすればよいですか? どんな助けでも大歓迎です、ありがとう!

編集:順序を保持する必要がある (つまり、MyClass1、MyClass2、MyClass3) ため、別の要素を導入する場合はMyClass4MyClass3. その理由は、特定の構造を持つ XML ドキュメントを作成しているからです。

4

1 に答える 1

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または、を 1 か所にまとめると、次のようになります。

// 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();
于 2013-02-08T14:01:46.430 に答える