C# 根据键数组按属性对数组进行排序

标签 c# arrays sorting comparison

假设我有以下 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 数组进行排序的最佳方法是什么?

最佳答案

一种方法如下:

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

关于C# 根据键数组按属性对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18199592/

相关文章:

c - 如何用C实现冒泡排序。

java - 使用 ECollections 进行扩展排序

c# - 如何在 C# (visual studio 2013) 中使用来自另一个命名空间的对象/类

c# - 扫描数据库中的新记录

c# - 请允许我是应用程序域的新手,我如何使用应用程序域运行构造函数

C++ 使 char 数组在输入时识别空格

php - 按输入数组的顺序从 elasticsearch 中检索信息

c# - 如何解决此 "Resource name is not a valid identifier"编译器警告

javascript - 按数组内容排序

sql - 排序结果与 mysql 中的内连接和左连接不同