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"}
};

基于键数组按名称对 MyClass 数组进行排序而不诉诸 for 循环的最佳方法是什么?

4

2 回答 2

5

一种方法如下:

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 回答