私は最近、LINQtoXMLの使用に関する悪名高いJonSkeetからの投稿に出くわしました。この特定のコードスニペットが私の目に留まりました。
// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
customers.Select(c => new XElement("customer", //This line is "magic"
new XAttribute("name", c.Name),
new XAttribute("lastSeen", c.LastOrder)
new XElement("address",
new XAttribute("town", c.Town),
new XAttribute("firstline", c.Address1),
// etc
));
foreachループを次のように設定したアプリケーションで自分でテストすることにしました。
foreach (var kvp in m_jobs) { //m_jobs is a Dictionary<string,Job>
m_xmlDoc.Root.Element("SCHED_TABLE").Add(
kvp.Value.GenerateXmlNode())
);
}
私は次のように変更しました:
m_xmlDoc.Root.Element("SCHED_TABLE").Add(
m_jobs.Select(job => job.Value.GenerateXmlNode())
};
ここで、GenerateXmlNode()は、特定のジョブ項目に適切なXMLマークアップを生成するメソッドです。何が起こるかはわかりませんでしたが、foreachループとまったく同じように機能することを確認してください。よくわからないのはなぜ?!また、これはLINQの「悪用」または「機能」と見なされますか?
明確にするために編集: .Selectは、私が要求したものを正確に含むIEnumerableを返すことを知っていますが、明示的に列挙していません。.Addは可変数の引数を受け入れるため、どのように機能するかを理解していますが、繰り返しになりますが、これらの引数を渡すために明示的に列挙していません。それで...それはまだどのように機能しますか?