Сортировка списка по имени свойства в соответствии с фиксированным набором строк - PullRequest
2 голосов
/ 16 мая 2019

Моя цель - отсортировать список по свойству Name по фиксированному набору строк preferedOrder.

Рассмотрим:

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

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

Я посмотрел на этот ответ и в итоге получил:

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

У меня вопрос, как достичь того же результата, только если preferedOrder реализован с string[]? как:

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

Я спрашиваю, потому что это критичный для производительности код, и я предполагаю, что реализация preferedOrder с массивом даст лучшие результаты.

Ответы [ 2 ]

4 голосов
/ 16 мая 2019

Если массив long , я предлагаю превратить его в Dictionary<string, int>, поскольку словарь быстрее (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);
0 голосов
/ 16 мая 2019

Завершается:

return list.OrderBy(item => Array.IndexOf(preferedOrder, item.Name));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...