因为在这种情况下,Select 接受一个 Func 委托,它将 IEnumerable 的每个元素作为键传递给该委托,以及该元素在可枚举中的位置。在您的情况下,元素是来自 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
类型只是编译器自动生成的匿名类型的占位符,用于表示和保存 lambda 表达式返回的对象,这些对象具有两个公共属性: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;
}