using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public object Value { get; private set; }
public Form1() {
InitializeComponent();
var c = new[] {
new { Code = 34, Name = "R・田中一郎", Age = 18 },
new { Code = 51, Name = "ぽぴ王子 ", Age = 18 },
new { Code = 111, Name = "IIJIMAS", Age = 20 },
};
var q1 = from x in c where x.Age == 18 select new { Code = x.Code, Name = x.Name };
var q2 = c.Where(x => x.Age == 18).Select(x => new { Code = x.Code, Name = x.Name });
var q3 = c.条件式(x => x.Age == 18).選択(x => new { Code = x.Code, Name = x.Name });
combo.DataSource = q3;
combo.ValueMember = "Code";
combo.DisplayMember = "Name";
combo.SelectedValueChanged += (sender, e) => Value = this.combo.SelectedValue;
}
}
public static class Extensions {
public static IEnumerable 条件式(this IEnumerable value, Func func) {
var r = new List();
foreach(var x in value) if (func(x)) r.Add(x);
return r;
}
public static IEnumerable 選択(this IEnumerable value, Func func) {
return value.Select(x => func(x));
}
}
}
C#3.0の新機能
は LINQ のためにあるという言葉を聞いたことがあります。
ってことは、新機能を駆使して書く場合に一番適当なコードは何だろうと考えた時、LINQ の中身を想像して書くことが一番手っ取り早いんじゃないかと思ってみた訳です。
上記のコードは、一般的な Windows アプリケーションで、Form1 に combo というコンボボックスを配置するだけで問題なく動作します。
q1,q2, q3 を差し替えてみると全く同じ結果が得られることが確認できます。
このコードを読むためには、C#3.0 の新機能を知っている必要があるので、逆に、このコードが読めれば C#3.0 の新機能は、ある程度理解できているのかな、と思ったりしました。