【问题标题】:Sorting list with by a property name according to a fixed set of strings根据一组固定的字符串按属性名称对列表进行排序
【发布时间】:2019-10-03 12:15:44
【问题描述】:

我的目标是根据一组固定的字符串preferedOrder,按Name 属性对列表进行排序。

考虑:

class MyClass
{
    string Name { get; set; }
}

List<string> preferedOrder = List<string> { "AA", "BB", ... } 

我查看了this answer 并最终得到:

return list.OrderBy(item => preferedOrder.IndexOf(item.Name));

我的问题是,只有在 preferedOrderstring[] 一起实现时,如何才能达到相同的结果?喜欢:

string[] preferedOrder = new[] { "AA", "BB", ... }

我之所以问,是因为它是一个性能关键代码,并且我假设使用数组实现 preferedOrder 会获得更好的结果。

【问题讨论】:

    标签: c# arrays performance sorting


    【解决方案1】:

    如果数组是long,我建议将其转换为Dictionary&lt;string, int&gt;,因为字典更快(Dictionary[...] 的时间复杂度为O(1),而O(N) 的时间复杂度为Array.IndexOf):

       string[] preferedOrder = new[] 
         { "AA", "BB", ... }
    
       Dictionary<string, int> map = preferedOrder
         .Select((value, index) => new {value, index}) 
         .ToDictionary(item => item.value, item => item.index);
    

    然后

      return list.OrderBy(item => map[item.Name]);
    

    或者如果item.Name 可以在map缺席

      // -1 - abscent values will be on top
      return list.OrderBy(item => map.TryGetValue(item.Name, out var v) ? v : -1);
    

    【讨论】:

      【解决方案2】:

      最后得到一个:

      return list.OrderBy(item => Array.IndexOf(preferedOrder, item.Name));
      

      【讨论】:

        猜你喜欢
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多