Существует так много способов сделать это.
Нехорошо создавать словарь stati c, особенно если у вас есть список значений stati c, уже в том порядке, в котором вы хотите (т.е. List<string> hierarchy = new List<string>{"HR", "TJ", "DJ" };
). Проблема со словарем stati c состоит в том, что он stati c - чтобы изменить его, вы должны перекомпилировать свою программу - а также она подвержена ошибкам - вы можете набрать номер неправильно. Лучше всего динамически создавать словарь. Таким образом, вы можете настроить hierarchy
во время выполнения и использовать его для заказа input
.
Вот базовый c способ создания словаря:
Dictionary<string, int> indices =
hierarchy
.Select((value, index) => new { value, index })
.ToDictionary(x => x.value, x => x.index);
Тогда это простая сортировка:
List<string> sorted = input.OrderBy(x => indices[x]).ToList();
Однако, если у вас отсутствует пропущенное значение в hierarchy
, это приведет к исключению KeyNotFoundException
.
Попробуйте с этим input
:
List<string> input = new List<string> { "TJ", "DJ", "HR", "HR", "TJ", "XX" };
Вам необходимо решить, удаляете ли вы отсутствующие элементы из списка или объединяете их в конце списка.
Чтобы удалить, вы сделаете следующее:
List<string> sorted =
input
.Where(x => indices.ContainsKey(x))
.OrderBy(x => indices[x])
.ToList();
Или для сортировки до конца вы сделаете это:
List<string> sorted =
input
.OrderBy(x => indices.ContainsKey(x) ? indices[x] : int.MaxValue)
.ThenBy(x => x) // groups missing items together and is optional
.ToList();
Если вы просто хотите удалить из input
элементы, которых нет в hierarchy
, тогда Есть несколько других вариантов, которые могут быть привлекательными.
Попробуйте это:
List<string> sorted =
(
from x in input
join y in hierarchy.Select((value, index) => new { value, index })
on x equals y.value
orderby y.index
select x
).ToList();
Или это:
ILookup<string, string> lookup = input.ToLookup(x => x);
List<string> sorted = hierarchy.SelectMany(x => lookup[x]).ToList();
Лично мне нравится этот последний. Это два лайнера, и он вообще не зависит от индексов.