「より良い方法」は、パフォーマンス、シンプルさなど、達成しようとしていることが何であるかによって異なります。
私はあなたが匿名のクラスで取得しようとしているものを含むクラスを作成すると思います。
public class Item {
public String Separator { get; set; }
public int FieldCount { get; set; }
}
、その後、私はLINQを変更します:これはあなたのテンプレートタグは、指定された属性を持つ2個のプロパティタグ、それぞれが含まれていない場合にはNullReference
例外が発生しますことを
var templates = from template in xml.Descendants("Template")
let children = template.Elements("Property")
select new Item() {
Separator = children.First(tag=>tag.Attribute("name").Value == "recordSeparator").Value,
FieldCount = Int32.Parse(children.First(tag=>tag.Attribute("name").Value == "fieldCount").Value)
};
List<Item> items = templates.ToList();
注意。
また、数値でない場合は、FieldCountから整数を解析する際に例外がスローされます。
アイデア:
XMLが生成された場合は、あなた自身で、あなたはそれが何かをしない理由フォーマット、です変更することができます。
<Template>
<Name>filename.txt</Name>
<RecordSeparator>\r\n</RecordSeparator>
<FieldCount>16</FieldCount>
</Template>
それは読み取り、解析する方が簡単だし、それはです少し短く最後に
は、私はこれは私がそれを行うだろうかだと思います。このクラスを持つ
:
public class Item
{
public String FileName { get; set; }
public String Separator { get; set; }
public int FieldCount { get; set; }
}
と、このプライベートメソッド:私はコード内で行うことができ
private Item GetItemFromTemplate(XElement node)
{
return new Item() {
FileName = node.Element("Name").Value,
Separator = node.Element("RecordSeparator").Value,
FieldCount = Int32.Parse(node.Element("FieldCount").Value)
};
}
:
XDocument doc = XDocument.Load("myfile.txt");
List<Item> items = (from template in doc.Elements("Template")
select GetItemFromTemplate(template)).ToList();
質問を明確にしてくださいあなたがしようとしていること。 http://tinyurl.com/so-hints –
を読んでください。単一のテンプレートに複数の区切り文字やfieldCountプロパティが必要ですか? Select()はIEnumerableの場合、IEnumerable を返します。これは、recordDelimとfieldCountの両方がIEnumerable のタイプであることを意味します。それは匿名のオブジェクトに必要なものですか? –
@kornelijepetak、xmlは常に同じで、これらの2つのプロパティのみを持ちます。 – hs2d