c# - 按数组中定义的顺序对字符串列表进行排序的有效方法?

标签 c# arrays list sorting

我正在尝试按另一个数组中定义的顺序对字符串列表进行排序。我知道可以通过多种方式实现,但我不确定如何有效地做到这一点。我需要它能够处理一个包含数千个项目的大型未排序列表。这是我想出的:

List<string> sortStringListByArray(List<string> unsortedList, string[] order)
{
     List<string> sortedList = new List<string>();
     for(int i = 0; i < order.Length; i++)
     {
          foreach(string s in unsortedList)
          {
              if(s.Equals(order[i]))
              {
                  sortedList.Add(s);
              }
          }
     }
     return sortedList;
}

它按预期工作,但效率肯定不高。有什么方法可以在不遍历列表和订单的情况下执行此操作?

编辑:澄清

谢谢!

最佳答案

表示它的最简单方法是使用右内连接:

return order.Join(unsortedList, a => a, b => b, (a, b) => b).ToList();

使用 Lookup 或 Dictionary 的最佳时间复杂度是 O(n+m) :

var lookup = unsortedList.ToLookup(x => x);

return order.SelectMany(x => lookup[x]).ToList();

使用 Dictionary<string, int> 可以使上面的速度快几倍获取 unsortedList 中的项目计数, 然后遍历 order根据counts Dictionary中对应的值生成结果。


LookupDictionary使用 hash table存储值。为了在哈希表中找到一个项目,从该值计算出一个哈希值,这类似于该值在哈希表中的位置的估计位置/索引。这只允许在哈希表中查找(或不查找)值所需的 1 次或少量比较。因此,从 unsortedList 生成查找或字典的时间复杂度为 O(n) , 因为哈希表的平均查找时间为 O(1)

关于c# - 按数组中定义的顺序对字符串列表进行排序的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56827070/

相关文章:

c# - 从不安全的结构中获取固定的数组值

javascript - 如何一次定位多个数据属性

javascript - 导航时列表项淡入淡出

Python - 生成具有特定模式的特定排列列表(添加到 itertools)

python - 在python([]或list())中初始化空列表的最佳实践是什么?

c# - 合并 pdf 列表并创建新书签 (C#)

c# - 更改 WinForms RichTextBox 中文本的颜色

c# - WPF 控制台应用程序在完成后不会返回提示

java - LinkedHashMap<double[], Integer>,无法使用 .get 或 .containsKey 访问 Integer

python - 在 matplotlib 中仅连接一段数字数组