0

IEnumerable<Item>xmlを文字列として含む「widgets」という名前のプロパティを持つwhereItemがあります。xmlには各ウィジェットの要素が含まれ、各ウィジェットには「foo」という名前のオプションの要素を含めることができます。例えば:

<widgets>
    <widget code="A">
        <foo>1</foo>
    </widget>
    <widget code="B" />
</widgets>

IEnumerable<Item>ウィジェットを表す匿名タイプのIEnumerableにフラット化できますか?

4

1 に答える 1

1

foo要素を繰り返すことができるかどうかはわかりませんが、この場合Enumerable<String>は、変更するのに十分簡単なとして返されます。

セットアップ(ここでは、同じWidgetsXMLを持つ2つの項目があります):

public class Item
{
    public string Name;
    public string Widgets;
}

var xml = "<widgets>\r\n    <widget code=\"A\">\r\n        <foo>1</foo>\r\n    </widget>\r\n    <widge" +
"t code=\"B\" />\r\n</widgets>";

var item1 = new Item {Name = "I1", Widgets = xml};
var item2 = new Item {Name = "I2", Widgets = xml};
var items = new Item[] {item1, item2}.AsEnumerable();

ウィジェットの選択プロセス:

var widgets = 
    from item in items
    from widget in XElement.Parse(item.Widgets).Elements("widget")
    select new {
        Name = item.Name,
        Code = widget.Attribute("code").Value,
        Foo = widget.Elements("foo").Select(f => f.Value)
    };

これにより、名前(アイテムから)とコードとフー(XMLから)が正しく設定された4つのアイテム(I1 A、I1 B、I2 A、I2 B)が得られます。

foo単一の要素になりたい場合、変更は次のようになります(基本的に設定)。これにより、が存在しないFirstOrDefault場合はnullが返されます。foo

var widgets = 
    from item in items
    from widget in XElement.Parse(item.Widgets).Elements("widget")
    select new {
        Name = item.Name,
        Code = widget.Attribute("code").Value,
        Foo = widget.Elements("foo").Select(f => f.Value).FirstOrDefault()
    };
于 2012-08-13T22:20:41.760 に答える