说我有以下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"}
};
基于keys数组按名称对MyClass数组进行排序的最佳方法是什么,而不需要使用for循环?
答案 0 :(得分:4)
一种方法如下:
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();
答案 1 :(得分: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的答案非常相似。