关于2参数Lambda的查询

关于2参数Lambda的查询,lambda,Lambda,在以下代码中,我缺少编译器如何知道k映射到musos,以及为什么v是自动递增的: string[] musos = { "David Gilmour", "Rick Wright", "Roger Waters", "Nick Mason" }; int[] keys = new int[] { 1, 4, 3, 2 }; var sorted = musos.Select((k, v) => new { Value = k, Key = keys[v] }) .OrderBy(

在以下代码中,我缺少编译器如何知道k映射到musos,以及为什么v是自动递增的:

string[] musos = { "David Gilmour", "Rick Wright", "Roger Waters", "Nick Mason" };
int[] keys = new int[] { 1, 4, 3, 2 };

var sorted = musos.Select((k, v) => new { Value = k, Key = keys[v] })
    .OrderBy(k => k.Key)
    .Select(v => v.Value.Split().Last())

foreach (var item in sorted)
{
    Console.WriteLine(item);
}
代码运行良好,返回:

吉尔莫·梅森·沃特斯·赖特


因为在这种情况下,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] };
             });
您现在可以想象在这种情况下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;
}
IEnumerable选择(IEnumerable musos,函数选择器)
{
int pos=0;
var results=新列表();
foreach(musos中的字符串k)
{
结果。添加(选择器(k,pos));
pos++;
}
返回(IEnumerable)结果;
}

因为在这种情况下,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] };
             });
您现在可以想象在这种情况下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;
}
IEnumerable选择(IEnumerable musos,函数选择器)
{
int pos=0;
var results=新列表();
foreach(musos中的字符串k)
{
结果。添加(选择器(k,pos));
pos++;
}
返回(IEnumerable)结果;
}
好吧,我们去

好吧,我们去看电影吧


好的,第一个参数(k)应该与枚举匹配。但是为什么v是自动递增的呢?是什么把它映射到元素号?哎呀,我在Func中缺少一个类型参数。v设置为可枚举元素的位置。它再次由Select方法在内部设置。好的,因此第一个参数(k)应该与枚举匹配。但是为什么v是自动递增的呢?是什么把它映射到元素号?哎呀,我在Func中缺少一个类型参数。v设置为可枚举元素的位置。它再次由Select方法在内部设置。