その場合、Selectは、IEnumerableの各要素をキーとして渡すFuncデリゲートと、列挙可能な要素内の要素の位置を取得するためです。あなたの場合、要素はmusos配列からの文字列です。
次のコード:
string[] musos = { "David Gilmour", "Rick Wright", "Roger Waters", "Nick Mason" };
int[] keys = new int[] { 1, 4, 3, 2 };
musos.Select((k, v) => new { Value = k, Key = keys[v] })
次のように解釈できます。
musos.Select((Func<string, int, ANONYMOUS_TYPE>)delegate(string k, int v){
return new ANONYMOUS_TYPE() { Value = k, Key = keys[v] };
});
上記の型は、コンパイラによって自動的に生成された匿名型の単なるプレースホルダーであり、ラムダ式によって返されるオブジェクトを表し、保持します。これらのオブジェクトには、型と型のANONYMOUS_TYPE
2つのパブリックプロパティがあります。このタイプは次のようになります。Value
string
Key
int
class ANONYMOUS_TYPE
{
public ANONYMOUS_TYPE()
{
}
public string Value { get; set; }
public int Key { get; set; }
}
これで、その場合のSelectの実装を想像できます。
IEnumerable<ANONYMOUS_TYPE> Select<string, ANONYMOUS_TYPE>(IEnumerable<string> musos, Func<string, int, ANONYMOUS_TYPE> selector)
{
int pos = 0;
var results = new List<ANONYMOUS_TYPE>();
foreach(string k in musos)
{
results.add(selector(k, pos));
pos++;
}
return (IEnumerable<ANONYMOUS_TYPE>)results;
}