1

次の2つの配列があるとします

string[] keys = new string[]{"Annalee Call","Bishop","Ash"};

MyClass[] vals = new MyClass[]{
    new MyClass(){name = "Ash"},
    new MyClass(){name = "Annalee Call"},
    new MyClass(){name = "Bishop"}
};

for ループに頼らずに、キー配列に基づいて MyClass 配列を名前で並べ替える最良の方法は何ですか?

4

2 に答える 2

5

それを行う1つの方法は次のとおりです。

var sorted = vals.OrderBy(s => Array.IndexOf(keys, s.name)).ToArray();

このアルゴリズムは漸近的に非常に遅いことに注意してくださいO(N^2*LogN)。複雑さがあります。「通常」に戻すにはO(N*LogN)、次のように、インデックスを見つけるためのルックアップ辞書を準備します。

var keyDict = keys.Select((v,i)=>new {v,i}).ToDictionary(p=>p.v, p=>p.i);
var sorted = vals.OrderBy(s => keyDict[s.name]).ToArray();
于 2013-08-13T02:19:19.517 に答える
1

このアプローチを使用してソートを行います。valsの値がリストにない場合は、ケースを処理しkeysます。

var rank =
    keys
        .Select((v, n) => new { Value = v, Rank = n, })
        .ToLookup(vn => vn.Value, vn => vn.Rank);

var query =
    from v in vals
    orderby rank[v.name]
        .DefaultIfEmpty(int.MaxValue)
        .First()
    select v;

それ以外の場合は、dasblinkenlight の回答と非常によく似ています。

于 2013-08-13T02:47:55.703 に答える