0

次のコードでは、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);
}

コードは完全に機能し、次を返します。

ギルモア・メイソン・ウォーターズ・ライト

4

2 に答える 2

2

では、 msdnに行きましょう

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, int, TResult> selector
)

要素のインデックスを組み込むことにより、シーケンスの各要素を新しい形式に射影します。

したがって、選択すると、要素 (k) とそのインデックス (v) が得られます。

そう

  • David Gilmour(k) with 0(v) (musos 配列の David Gilmour のインデックス)
  • Rick Wright(k) with 1(v) (musos 配列の Rick Wright のインデックス)

keys 配列は musos 配列と少なくとも同じ長さなので、コードは機能します。

keys[0] = 1 //  0 = v
keys[1] = 4 // 1 = v
keys[2] = 3 // 2 = v
keys[3] = 2 // 3 = v
于 2013-03-08T14:46:08.963 に答える
1

その場合、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_TYPE2つのパブリックプロパティがあります。このタイプは次のようになります。ValuestringKeyint

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;
}
于 2013-03-08T14:40:36.903 に答える