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拡張メソッドの呼び出しを意図しなくなり、コンパイルエラーになります。このような場合は、単純に明示的な記述するのでしょうか。