【C#】varを使う場合と使わない場合

JUGEMテーマ:コンピュータ

ローカル変数を宣言する場合にvarが使えるようになったのはC#3.0からだったと思います。
最近は意識的に「var」を記述するときとそうでないときを使い分けています。

varを使わないパターン
 ・foreachのコレクションの要素の変数
 ・メソッドの戻り値(Linq内での作成した匿名クラスを返すコレクションはvarを使う)
 ・プロパティのGetter
varを使うパターン
 ・コンストラクタ
 ・キャスト

同一行内(末尾の「;」まで)で同じ型を2回書くような場合は一回で済むようにvarを使ってます。
ただし、一回、型を書いた後にvarに書き直してることが多いです。



【C#】LINQを使って見て数年・・・

「LINQ」を使い初めてからバグコードを書く頻度が減った(ような気がする)ことに、最近、気づきました。なんでしょうね。

心当たりはあるのですが、残念、文章でまとめられない。


【雑記】バインディングを考えてます。

何かがあって、何かを指す何かがある。
「何か」は、「『何か』を指す何か」より大きい。
「『何か』を指す何か」は、「何か」を指すために存在するから、
「何か」より小さくなるのは必然なんだね。

「『何か』を指す何か」を作ることを「バインディング」って言うのかな?


【お勧めセミナー】NECラーニング

Windows Phone JUGEMテーマ:コンピュータ


(Developer Camp)−Phoneアプリをマーケットプレイスへ登録しよう!!−
http://www.neclearning.jp/courseoutline/courseId/MV040/.3

受講料無料でタダでApp Hubの登録ができますよ。先週、受講しApp Hub登録してきました。

※注意 App Hubを登録しても実機のWindow Phone持ってないと何の役にも立たないので注意です。


【雑記】最近、興味の矛先は

 最近、「バインディング」に関していろいろ調べてみたり、考察してみたりしてます。
WPFのBindingだけじゃなくて、もっと広域的にバインディングって何だろってあれやこれやしてます。

まとまった何か言いたくなったらここに書きます。
発散してはじけたら、また再来年ぐらいに・・・



---------------
その前に

【WPF】ListBoxやDataGridをグループ化表示する。
http://pro.art55.jp/?eid=1303859

の肝心なところを書いてないから書かないと!!


【訃報】ジョブズ死去

中二病だった高校生の頃はビルゲイツにあこがれていました。いまだに中二病ですが、いまはジョブズにあこがれています。実のところジョブズという人物がいることを知ったのは、就職後だったような気がします。Apple社はそれ以前から知ってた思います。

そんなあこがれのジョブズが亡くなられたことは、ショックです。

私は生粋の日本人で母国語オンリーで生きている人間ですので、ジョブズという人物を直接、見てたり、聞いてたりなんて事はありません。また聞きの、またまた聞きくらいにしか、その人物にふれたことがありません。しかし、これまでの人生でジョブズの手がけた物のいくつかをさわったことがあります。

その一つが中学生だった頃にさわったMacintosh。美術の先生の私物パーソナルコンピュータで、リンゴがカラフルな配色がされていたのを記憶しています。先生の言葉を鵜呑みにして、他のコンピュータとは違う、これが最高のパーソナルコンピュータだと思っていました。エアーフォッケーゲームの難しいことこの上なかったです。

それから、大学にあった端末でホームページ作りに夢中になりました。大学ではプログラミングはほとんど勉強する機会がなかったので、いま考えると惜しいことをしたと思うのですが、当時さわっていた端末が「NeXTSTEP」でした。ホームアイコンが点描で書かれていたり、細部に職人のこだわりを感じる端末でした。残念ながらアホな大学生だったので「ホームディレクトリー」という概念に気づくのには多少時間が必要でして(笑)
大学の端末は、途中から「NeXTSTEP」からLinuxのVineに替わりがっかりしたことを思い出しました。今思えば、見た目の完成度・洗礼されたデザインから、チープなデザインになったことでが一番がっかりだったとしたことだと思います。

それから拾ったPowerMac(捨てた人からもらって良いと許可はもらいましたよ)・・・もってるだけで幸せでした。

MacMiniなんか幸せでした。

Macintosh、NeXTSTEP、PowerMac、MacMini・・・全部、「こいつは凄いヤツなんだ!」という雰囲気があり、紹介されたときはそんな事を聞いた記憶があります。

私の人生にときたま現れるジョブズの作品。さわったことのあるというだけで少し幸せな気持ちにされてくれました。それが、これからは生み出されないと思うと少し寂しいです。

Steve Jobs, 1955 - 2011

心よりご冥福をお祈り申し上げます。


【WPF】ItemsControlにアイテムのコレクションを設定するには?3

JUGEMテーマ:コンピュータ

-----------------------------------------
本投稿は下記のシリーズの一部です。
【WPF】ListBoxやDataGridをグループ化表示する。
http://pro.art55.jp/?eid=1303859
------------------------------------------

----------------------
ItemsControl.ItemsSourceプロパティにIEnumerableインターフェースを継承するオブジェクトを代入することにより、ItemsControlのコンテンツを生成することができます。ItemsControl.ItemsSourceプロパティで指定したコレクションをフィルター処理、ソート処理、グループ化処理が実施されたコレクションがItemsControl.Itemsの各アイテムとして公開さ、ListBoxの表示対象となります。
----------------------
と、以前に書きましたが、これの動きを今回は確認したいと思います。

たとえば、とある街に売り出し物件があったとします。
物件には
・東から西方向へ番号が付けれれています(Address)
・売り出し価格が付いています(Price)
・売り出し中または既に売れているフラグがあります(IsSele)
・一戸建て・アパート・ビルの3タイプがあります。(Type)

これをクラスで表すと

    class House
    {
        public House(int address, int price, bool isSale, HouseType type)
        {
            Address = address;
            Price = price;
            IsSale = isSale;
            Type = type;
        }

        public int Address { get; private set; }
        public int Price { get; private set; }
        public bool IsSale { get; private set; }
        public HouseType Type { get; private set; }
    }

    enum HouseType
    {
        Single,
        Apartment,
        Building,
    }

と書くことにしました。さらに、実際の家々を表現するために東から物件を列挙する事ができるコレクションクラス(今回のサンプルコードでは実際には入れた順になっています。)を作成します。今回はZ地区に関する情報を取得するGetAreaZメソッドを用意しています。MyList<T>クラスはIEnumerableインターフェイスを継承するジェネリッククラスです。MyList<T>クラスの詳細に関してはSource and Projectをご覧ください。

    class HouseCollection : MyList<House>
    {
        public static HouseCollection GetAreaZ()
        {
            return new HouseCollection
                       {
                           new House(1, 100, true, HouseType.Single),
                           new House(2, 150, true, HouseType.Single),
                           new House(3, 90, true, HouseType.Single),
                           new House(4, 3000, true, HouseType.Building),
                           new House(5, 2000, false, HouseType.Apartment),
                           new House(6, 100, true, HouseType.Single),
                           new House(5, 2000, true, HouseType.Apartment),
                           new House(6, 170, false, HouseType.Single),
                           new House(7, 3000, false, HouseType.Apartment),
                           new House(8, 2500, false, HouseType.Apartment),
                           new House(9, 20000, true, HouseType.Building),
                           new House(10, 200000, false, HouseType.Apartment),
                           new House(11, 10000, true, HouseType.Single),
                           new House(12, 1000, true, HouseType.Single),
                       };
        }
    }

さて、このZ地区の物件の一覧を見たいユーザがいました。彼の要求は以下の通りです。

・一覧表示であること。
・各物件の「タイプ」「住所」「値段」が表示されていること。
・一戸建て・アパート・ビルのそれぞれのタイプ別に分かれていること。
・各タイプで価格の安い順にならんでいること。
・売り出し中のものだけがみたい。

これを満たすようにItemsControlを設定したのが下記のコードです。

    class Program
    {
        [STAThread]
        static void Main()
        {
            var itemsControl = new ItemsControl();
            itemsControl.Items.SortDescriptions.Add(new SortDescription("Price", new ListSortDirection()));
            if (itemsControl.Items.GroupDescriptions != null)
                itemsControl.Items.GroupDescriptions.Add(new PropertyGroupDescription("Type"));
            itemsControl.Items.Filter += Filter;

            itemsControl.ItemsSource = HouseCollection.GetAreaZ();
            foreach (House house in itemsControl.Items)
            {
                Console.WriteLine("Type:" + house.Type + " Address:" + house.Address + " Price:" + house.Price);
            }
        }

        static bool Filter(object item)
        {
            var house = item as House;
            if (house == null)
                return false;
            return house.IsSale;
        }
    }

実際に、実行してみると

Type:Single Address:3 Price:90
Type:Single Address:6 Price:100
Type:Single Address:1 Price:100
Type:Single Address:2 Price:150
Type:Single Address:12 Price:1000
Type:Single Address:11 Price:10000
Type:Apartment Address:5 Price:2000
Type:Building Address:4 Price:3000
Type:Building Address:9 Price:20000

今回は目的は

ItemsControl.ItemsSourceにコレクションを代入したら、そのコレクションがソート処理、フィルター処理、グループ化処理が実施されたあと要素が、ItemsControl.Itemsのコレクションの各要素にオブジェクトが設定されることを確認することが目的でしたが、実際に確認できました。

考察を深めていくと、ItemsSourceに設定したIEnumerableインターフェイスを継承するオブジェクトとItemsControl.Itemsで公開されているItemsCollectionの関係は下記の用になっていますことに気づきます。


GoFのデザインパターンで言うところのProxyパターンになっています。つまり、「ItemsCollectionは、Watcherの知りたいことを、HouseCollectionに代行して答えている。」と解釈できます。また、HouseCollectionにたいしてのソート・フィルタ・グループ化の機能拡張として見ればDecoratorパターンに当たると思います。

少し余談がながくなりましたが、とりあえずItemsControl.Itemsの確認がとれたので今回はここでいったん止めます。



【WPF】ItemsControlにアイテムのコレクションを設定するには?2

JUGEMテーマ:コンピュータ

-----------------------------------------
本投稿は下記のシリーズの一部です。
【WPF】ListBoxやDataGridをグループ化表示する。
http://pro.art55.jp/?eid=1303859
------------------------------------------



ItemsControlにアイテムのコレクションを設定するには、ItemsControl.ItemsSourceプロパティにIEnumerableインターフェイスを継承するオブジェクトを代入すると良いと、前回に紹介しましたが、今回は「IEnumerableインターフェイスを継承するオブジェクト」とは何かに付いて考察してみたいと思います。

--------------------------------
IEnumerableインターフェイスは、IEnumeratorインターフェイスを継承するオブジェクトを返すGetEnumeratorメソッドを持ちます。IEnumeratorインターフェイスはGofのデザインパターンの一つであるイテレータパターンでいうところのイテレータを表すインターフェイスです。

イテレータパターンを正しく実装した場合は、IEnumerableインターフェイスを継承するオブジェクトの各要素は、IEnumeratorインターフェイスを通して、順次呼び出すことができます。
---------------------------------

過去に何度もBlogで紹介したことのある実装ですが、今回はイレテータパターンという観点からクラスの実装を紹介します。

作りたいオブジェクトは線形リストの構造をもつコレクションです。


線形リストはNodeオブジェクトを上記の図のようにNode同士を連結させた構造を持ちます。Nodeは値と次のNodeを参照するNextプロパティを持ちます。クラスで表現すると下記の通りです。

namespace Art55Library
{
    class Node
    {
        public int Value { get; set; }
        public Node Next { get; set; }
    }
}

今回は、実装を簡単にするため値はint型の値を取ることにしました。このNodeオブジェクトを集約させるオブジェクトが線形リストオブジェクトとなります。線形リストは、Addメソッドで値を最後尾に追加させる事ができます。

クラスで表現すると

using System.Collections;

namespace Art55Library
{
    public class MyList : IEnumerable 
    {
        public void Add(int value)
        {
            if (_first == null)
            {
                _first = new Node {Value = value};
                _last = _first;
            }
            else
            {
                _last.Next = new Node {Value = value};
                _last = _last.Next;
            }
        }

        private Node _first;
        private Node _last;

        public IEnumerator GetEnumerator()
        {
            return new Iterator(_first);
        }
    }
}

みての通り、IEnumerableインターフェイスを継承させています。よってIEnumerator を明示的に実装しました。(ちなみにyield reaturn構文を使えば、IEnumerator をプログラマが実装する必要はありません。)

using System.Collections;

namespace Art55Library
{
    class Iterator : IEnumerator
    {
        public Iterator(Node top)
        {
            _top = top;
        }

        private readonly Node _top;
        private Node _current;

        public bool MoveNext()
        {
            if (_current == null)
                Reset();
            else
                _current = _current.Next;
            return _current != null;

        }

        public void Reset()
        {
            _current = _top;
        }

        public object Current
        {
            get { return _current.Value; }
        }
    }
}

ここまででイテレータパターンを実装する線形リストクラスのコードは終わりです。

実際に、使って見ると(今回はforeach構文は使わずに、外部イテレータで書いています)

using System;
using Art55Library;
using System.Collections;

namespace IteratorDemo20111004_001
{
    class Program
    {
        static void Main()
        {
            var list = new MyList {1, 2, 3, 4};

            IEnumerator iterator = list.GetEnumerator();
            while (iterator.MoveNext())
            {
                Console.WriteLine(iterator.Current);
            }
        }
    }
}

実行結果

1
2
3
4

forechを使えば

            foreach (int value in list)
            {
                Console.WriteLine(value);
            }

と、かけます。イテレータパターンの利点は、クライアントと何らのオブジェクトを集約するオブジェクト間にIEnumerator インターフェイスを一つ挟む事で、個々のオブジェクトをアクセスする共通の方法が提供出来る点です。C#の場合であれば、IEnumerable インターフェイスを継承するクラスであれば、foreach構文で各要素に逐一アクセスできるということになります。(C#の仕様上、IEnumerable を継承していなくてもforeachが使えるケースがあります)

余談ですが、MyListクラスの利用するクラスはNodeクラスの存在を知る必要はないため、今回の実装では見えないようにしました。ただし、プログラマはパフォーマンスの要件などにより、Nodeクラスの存在またはそれらの関連を知っておかなければならないかもしれません。



ということでWPFの世界に戻ります。

ItemsControl.ItemsSourceプロパティはIEnumerable インターフェイスのオブジェクトを設定可能です。つまり、集約した個々のオブジェクトを何らかの順序で列挙可能な能力をもつ集約オブジェクトをItemsControl.ItemsSourceプロパティへ代入することができます。つまり、コレクションを丸ごと代入することができるということです。

using Art55Library;

namespace MyListViewDemo20111005_001
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            itemsControl.ItemsSource = new MyList {1, 2, 3, 4,};
        }
    }
}



----
(2011/10/6)
IEnumerableと書くべきところをIEnumeratorと表記してあるところがありましたので修正しました。


【WPF】ItemsControlにアイテムのコレクションを設定するには?

 JUGEMテーマ:コンピュータ

-----------------------------------------
本投稿は下記のシリーズの一部です。
【WPF】ListBoxやDataGridをグループ化表示する。
http://pro.art55.jp/?eid=1303859
------------------------------------------


----------------------
ItemsControl.ItemsSourceプロパティにIEnumerableインターフェースを継承するオブジェクトを代入することにより、ItemsControlのコンテンツを生成することができます。ItemsControl.ItemsSourceプロパティで指定したコレクションをフィルター処理、ソート処理、グループ化処理が実施されたコレクションがItemsControl.Itemsの各アイテムとして公開さ、ListBoxの表示対象となります。
----------------------

今回はItemsControl.ItemsSourceプロパティに値を代入する方法を紹介します。

            IEnumerable collection = ...
            listBox.ItemsSource = collection;

これだけです。

逆にいう「IEnumerable」を継承していないオブジェクトをlist.ItemsSourceプロパティに代入することは出来ません。(nullは代入できますよ)


------------------
この投稿を書くのに半月悩みました。細々とした物は別の投稿にしようと思います。


【WPF】ICollectionView.GroupDescriptionsを利用せずにグループ化表示2

JUGEMテーマ:コンピュータ
-----------------------------------------
本投稿は下記のシリーズの一部です。
【WPF】ListBoxやDataGridをグループ化表示する。
http://pro.art55.jp/?eid=1303859
------------------------------------------



方法:ICollectionView.GroupDescriptionsを利用せずにグループ化表示2
--------------------------------------------------------------------------
ICollectionView.GroupDescriptionsを利用せずグループ化表示は可能です。グループ単位にコレクションを分割し、個別にListBoxに配置することでユーザはグループ化されたリストを認識することができます。
--------------------------------------------------------------------------

前回紹介した「ICollectionView.GroupDescriptionsを利用せずにグループ化表示」とは別の方法でグループ化表示しようと思います。今回は、グループ単位でListBoxを分けます。ただし、この方法は選択されたオブジェクトの全てを個々のListBoxから単純に得られなくなるという弊害が出てきますが、用意するデータ側で選択された状態を保持しListBoxと同期させることで簡単に選択されたオブジェクトを取得できるようになります。

早速、サンプルコードを紹介します。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;

namespace ListBoxGroupingDemo20110917_002
{
    public class Prefecture : INotifyPropertyChanged
    {
        static Prefecture()
        {
            Prefectures = new ReadOnlyCollection<Prefecture>(new List<Prefecture>
                                  {
                                      new Prefecture("北海道", "北海道"),
                                      ...
                                      new Prefecture("鹿児島県", "九州"),
                                      new Prefecture("沖縄県", "沖縄")
                                  });
        }

        private static readonly ReadOnlyCollection<Prefecture> Prefectures;

        public static ReadOnlyCollection<Prefecture> GetAllPrefectures()
        {
            return Prefectures;
        }

        private Prefecture(string name, string groupname)
        {
            Name = name;
            GroupName = groupname;
        }

        public PrefectureGroup GetPrefectureGroup()
        {
            return PrefectureGroup.GetAllPrefectureGroup().FirstOrDefault(pg => pg.GroupName == GroupName);
        }

        public string Name { get; private set; }
        public string GroupName { get; private set; }
        public int ColumnIndex
        {
            get
            {
                return GetPrefectureGroup().Prefectures.Select(p => p.Name).ToList().IndexOf(Name) + 1;
            }
        }
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set
            {
                if (_isSelected != value)
                {
                    _isSelected = value;

                    PrefectureGroup prefectureGroup = GetPrefectureGroup();
                    prefectureGroup.MargeIsSelected();
                    OnPropertyChanged("IsSelected");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string proerptyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) 
                handler(this, new PropertyChangedEventArgs(proerptyName));
        }
    }
}
 
プロパティの変更通知をサポートするPrefecture(都道府県クラス)を用意します。このクラスはName(県名)とGroupName(地方名)とIsSelected(選択状態)をプロパティとして公開しています。

Prefectureに対してグループ化した概念である地方を表すクラスを別途用意しました。それが下記のコードです。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;

namespace ListBoxGroupingDemo20110917_002
{
    public class PrefectureGroup : INotifyPropertyChanged
    {
        static PrefectureGroup()
        {
            List<PrefectureGroup> prefectureGroups = Prefecture.GetAllPrefectures().GroupBy(p => p.GroupName).Select(
                group => new PrefectureGroup(group.Key, group.ToList())).ToList();
            GetAllPrefectureGroups = new ReadOnlyCollection<PrefectureGroup>(prefectureGroups);
        }

        public PrefectureGroup(string groupName, List<Prefecture> groupingPrefectures)
        {
            GroupName = groupName;
            Prefectures = new ReadOnlyCollection<Prefecture>(groupingPrefectures);
        }

        private static readonly ReadOnlyCollection<PrefectureGroup> GetAllPrefectureGroups;
        public static ReadOnlyCollection<PrefectureGroup> GetAllPrefectureGroup()
        {
            return GetAllPrefectureGroups;
        }

        public string GroupName { get; private set; }
        public ReadOnlyCollection<Prefecture> Prefectures { get; private set; }
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set
            {
                if (_isSelected != value)
                {
                    _isSelected = value;
                    AllSelectedCore(value);
                    OnPropertyChanged("IsSelected");
                }
            }
        }

        public void MargeIsSelected()
        {
            if (Prefectures.All(p => p.IsSelected))
            {
                _isSelected = true;
                OnPropertyChanged("IsSelected");
            }
            else if (Prefectures.Any(p => !p.IsSelected))
            {
                _isSelected = false;
                OnPropertyChanged("IsSelected");
            }
        }

        public void AllSelect()
        {
            AllSelectedCore(true);
        }

        public void AllUnSelect()
        {
            AllSelectedCore(false);
        }

        private void AllSelectedCore(bool isSelect)
        {
            foreach (Prefecture prefecture in Prefectures)
            {
                prefecture.IsSelected = isSelect;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string proerptyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) 
                handler(this, new PropertyChangedEventArgs(proerptyName));
        }
    }
}

PrefectureGroupクラスは地方を表すクラスです。プロパティの変更通知をサポートします。GroupName(地方名)プロパティと、地方に属する都道府県をコレクションであるPrefecturesプロパティと、その地方全体が選択されているという事を表すIsSlectedプロパティを公開しています。
続きを読む >>

calendar
1234567
891011121314
15161718192021
22232425262728
293031    
<< January 2012 >>
あわせて読みたい
あわせて読みたいブログパーツ
selected entries
categories
archives
recent comment
recent trackback
recommend
キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。
recommend
ビジュアライジング・データ ―Processingによる情報視覚化手法
ビジュアライジング・データ ―Processingによる情報視覚化手法 (JUGEMレビュー »)
Ben Fry
javaぽい言語Processingを用いたビジュアライジングデータ。タイトルの通りいかにデータを視覚化するかというところを解説した本、手法やプロセスに対して丁寧でかつ具体的な例を挙げているのでわかりやすく、また応用が利きます。すばらしい本です。
recommend
recommend
recommend
recommend
recommend
recommend
Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰
recommend
recommend
recommend
Design rule index―デザイン、新・100の法則
Design rule index―デザイン、新・100の法則 (JUGEMレビュー »)
William Lidwell,Kritina Holden,Jill Butler
ユーザインターフェイス、ユーザビリティなどを考えたいならこの本をヒントにしてみるのも良いかと思います。
recommend
リファクタリング―プログラムの体質改善テクニック (Object Technology Series)
リファクタリング―プログラムの体質改善テクニック (Object Technology Series) (JUGEMレビュー »)
マーチン ファウラー,Martin Fowler,児玉 公信,平澤 章,友野 晶夫,梅沢 真史
Javaで書かれていますが、良本です。言語を覚えたら、まずこの本を読んでみましょう。
recommend
集合知プログラミング
集合知プログラミング (JUGEMレビュー »)
Toby Segaran
・・・挫折中の一本。
recommend
C#ではじめるWebサービスプログラミング
C#ではじめるWebサービスプログラミング (JUGEMレビュー »)
山崎 秀,笠原 一浩
動くモノが作れるから楽しい、この本で実現しましょう!
recommend
C#クックブック 第3版
C#クックブック 第3版 (JUGEMレビュー »)
Jay Hilyard,Stephen Teilhet
C#2.0からの移行を考えているならこの本がお勧めです。
recommend
LINQテクノロジ入門~Microsoft Visual Studio 2008による新たなクエリ構築技法~ (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ) (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ)
LINQテクノロジ入門~Microsoft Visual Studio 2008による新たなクエリ構築技法~ (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ) (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ) (JUGEMレビュー »)
赤間信幸
LINQ最強の入門本です。LINQの処理をイメージをわかりやすく解説されています。また、著者の赤間さんはわかりやすい解説をされることで超有名です。
recommend
Pro LINQ: Language Integrated Query in C# 2008 (Windows.Net)
Pro LINQ: Language Integrated Query in C# 2008 (Windows.Net) (JUGEMレビュー »)
Jr. Rattz Joseph C.
LINQをしっかり学びたい方にお勧めします。
recommend
recommend
WPF Recipes in C# 2008: A Problem-Solution Approach (Expert's Voice in .Net)
WPF Recipes in C# 2008: A Problem-Solution Approach (Expert's Voice in .Net) (JUGEMレビュー »)
Sam Noble,Sam Bourton,Allen Jones
WPFの基礎を一通り学習したら、この本を手に取りましょう。WPFのHowToやDeepな情報を得ることが出来ます。かなりお勧めです。
(注意:サンプルコードのレイアウト設計は間違ってるので注意です)
links
profile
search this site.
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM
JUGEMのブログカスタマイズ講座