C# 3.0 / Query実験コード
前回に引き続き、コンソールからのコンパイルで今度はQuery関連を試してみました。
少し実践に近いもので見てみるために、ゲーム的な所持品管理をQueryで処理することを想定してみました。実践をイメージしているためコードは少し長くなっていますが、ロジック自体はコンパクトに表されています。
今回は便宜上、アイテムを単純に名前と重さの実体だけで扱うものとしました。
重さ0を超えるアイテムを選び、アイテム名でソートして出力しています。その後に追加情報を2行ほど出力しています。
using System; using System.Query; static class Program { class Item { public string Name; public int Weight; public override string ToString() { return string.Format("{0} : {1}g", Name, Weight); } } public static void Main() { var inventory = new Item[] { { Weight = 300, Name = "ポーション", }, { Weight = 500, Name = "薬草", }, { Weight = 1100, Name = "短剣", }, { Weight = 600, Name = "木の棒", }, { Weight = 800, Name = "石ころ", }, { Weight = 1000, Name = "ポーチ", }, { Weight = 0, Name = "Empty", }, }; var collection = from item in inventory where item.Weight > 0 orderby item.Name select item; foreach (var item in collection) Console.WriteLine(item); Console.WriteLine("総重量 : {0}g", inventory.Sum(item => item.Weight)); Console.WriteLine("1kg以上の所持品の数 : {0}", inventory.Count(item => item.Weight >= 1000)); } }
実行結果
ポーション : 300g ポーチ : 1000g 石ころ : 800g 短剣 : 1100g 木の棒 : 600g 薬草 : 500g 総重量 : 4300g 1kg以上の所持品の数 : 2
感触
使う場所によってはパフォーマンスとのトレードオフにはなるのでしょうけど、雑多の便利機能の実装に標準が利用できるというのは、メンテナンスしなければならない自前のコードを増やさない点でよいと思われます。
まだ最適な手法を知らない点
例えば、
var inventory = new Item[] {
の部分をさらなる応用などを見越して、
var inventory = new List<Item> {
とすると、その後に現れるinventory.Countの意味が変わります。
inventoryが持つCountプロパティとして解釈され、Count拡張メソッドの呼び出しを意図しなくなり、コンパイルエラーになります。このような場合は、単純に明示的な記述するのでしょうか。