簡體   English   中英

C#基於鍵數組的按屬性排序數組

[英]C# Sort Array by property based on key array

說我有以下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循環的情況下,基於keys數組按名稱對MyClass數組進行排序的最佳方法是什么?

一種方法如下:

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();

我將使用這種方法進行排序。 如果keys列表中缺少vals中的值,它將處理這種情況。

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的答案非常相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM