最近、やけに文法が乱れきっているC#。教える方もお手上げに近いのでは。C++もboostクラスでgdgdですけど。
しかし、未だにLinqの解説本が日本で出版されていないのは、ネットが悪いのか?

test1()がtest7()までに変遷する様子を書いてみた。順に追っていくとC#の何を理解すればよいかわかるはず。
test1(),test2(),test3(),test4(),test5(),test6(),test7()すべて同じ文字を出力します。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Class1
{

static string [] names = { "Tom","Dick","Harry" };


static public void test1()
{
for( int i = 0; i < names.Length; i++ )
{
Console.WriteLine( names[i].ToUpper() ); // "TOM","DICK","HARRY" 大文字に変換
}
}
static public void test2()
{
IEnumerable<string> query = test21();

foreach( string s in query )
{
Console.WriteLine( s.ToUpper() ); // "TOM","DICK","HARRY"
}
}
static public IEnumerable<string> test21()
{
foreach( string name in names )
{
yield return name; // yield returnは裏で状態を保存しながら、値を返す。 http://msdn.microsoft.com/ja-jp/library/9k7k7cf0.aspx
}
}

static public void test3()
{
// Funcとは "delegate TResult Func<T, TResult>(T arg );" としてすでに宣言されている。1コの引数とリターン値。
// Selectは拡張メソッド 。クラスのメンバー関数ように記述できる。http://msdn.microsoft.com/ja-jp/library/bb383977.aspx

Func<string, string> selector = test31;

IEnumerable<string> query = test21().Select(selector);

foreach( string s in query )
{
Console.WriteLine( s ); // "TOM","DICK","HARRY"
}
}

static public string test31( string s )
{
return s.ToUpper();
}


static public void test4()
{
// selectorを無名関数(匿名メソッド)にする。

Func<string, string> selector = delegate (string str){ return str.ToUpper(); };

IEnumerable<string> query = test21().Select(selector);

foreach( string s in query )
{
Console.WriteLine( s ); // "TOM","DICK","HARRY"
}
}

static public void test5()
{
// 無名関数(匿名メソッド)を書き換え。"=>" とはラムダ演算子。">="は普通の演算子http://msdn.microsoft.com/ja-jp/library/bb311046.aspx

Func<string, string> selector = (str) => str.ToUpper(); // (str)の()は省略可。でも、()付きが正しい書き方。

IEnumerable<string> query = test21().Select(selector);

foreach( string s in query )
{
Console.WriteLine( s ); // "TOM","DICK","HARRY"
}
}

static public void test6()
{
// test5()と同じ

IEnumerable<string> query = test21().Select( (str) => str.ToUpper()); // (str)の()は省略可。でも、()付きが正しい書き方。

foreach( string s in query )
{
Console.WriteLine( s ); // "TOM","DICK","HARRY"
}
}

static public void test7()
{
// コンパイラがfrom句を発見すると、裏でfrom, selectをtest6()の形に書き換えてから、コンパイルを実行する。

IEnumerable<string> query = from a in test21() select a.ToUpper();

foreach( string s in query )
{
Console.WriteLine( s ); // "TOM","DICK","HARRY"
}
}

}
}