Linq OrderBy против определенных значений

Есть две отдельные ошибки.

Во-первых, вы забыли добавить main.cpp в ваш make-файл.

Во-вторых, ваш main.cpp не содержит глобальной функции с именем main. Функция-член класса с именем main не подходит. Вам нужна функция с именем main в глобальном пространстве имен с внешней связью.

40
задан Jonathan Parker 8 April 2009 в 02:44
поделиться

4 ответа

При помещении предпочтений в список это могло бы стать легче.

List<String> data = new List<String> { "A","B","A","C","B","C","D","E" };
List<String> preferences = new List<String> { "A","B","C" };

IEnumerable<String> orderedData = data.OrderBy(
   item => preferences.IndexOf(item));

Это поместит все объекты, не появляющиеся в preferences впереди, потому что IndexOf() возвраты -1. Специальная работа вокруг могла бы инвертировать preferences и закажите убывание результата. Это становится довольно ужасным, но работы.

IEnumerable<String> orderedData = data.OrderByDescending(
   item => Enumerable.Reverse(preferences).ToList().IndexOf(item));

Решение становится немного более хорошим если Вы concat preferences и data.

IEnumerable<String> orderedData = data.OrderBy(
   item => preferences.Concat(data).ToList().IndexOf(item));

Мне не нравится Concat() и ToList() там. Но в настоящий момент у меня нет действительно хорошего пути вокруг этого. Я ищу хороший прием для превращения -1 из первого примера в большое количество.

102
ответ дан Daniel Brückner 27 November 2019 в 01:06
поделиться

Поместите предпочтительные значения в словарь. Поиск ключей в словаре является O (1) операция по сравнению с нахождением значений в списке, который является O (n) операция, таким образом, это масштабируется намного лучше.

Создайте строку вида для каждого предпочтительного значения так, чтобы они были размещены перед другими значениями. Для других значений само значение будет использоваться в качестве сортирующий строку так, чтобы они были на самом деле отсортированы. (Используя любое произвольное высокое значение только разместил бы их в конце неотсортированного списка).

List<string> data = new List<string> {
    "E", "B", "D", "A", "C", "B", "A", "C"
};
var preferences = new Dictionary<string, string> {
    { "A", " 01" },
    { "B", " 02" },
    { "C", " 03" }
};

string key;
IEnumerable<String> orderedData = data.OrderBy(
    item => preferences.TryGetValue(item, out key) ? key : item
);
5
ответ дан Guffa 27 November 2019 в 01:06
поделиться

Да, необходимо реализовать собственное IComparer<string> и затем передайте его в как второй аргумент метода OrderBy LINQ.

Пример может быть найден здесь: Упорядочивание результаты LINQ

1
ответ дан Ben Hoffstein 27 November 2019 в 01:06
поделиться

Решение Danbrucs более изящно, но здесь является решением с помощью пользовательского IComparer. Это могло бы быть полезно при необходимости в более усовершенствованных условиях для упорядочивания вида.

    string[] svals = new string[] {"A", "B", "A", "C", "B", "C", "D", "E"};
    List<string> list = svals.OrderBy(a => a, new CustomComparer()).ToList();

    private class CustomComparer : IComparer<string>
    {
        private string firstPref = "A";
        private string secondPref = "B";
        private string thirdPref = "C";
        public int Compare(string x, string y)
        {
            // first pref 
            if (y == firstPref && x == firstPref)
                return 0;
            else if (x == firstPref && y != firstPref)
                return -1;
            else if (y == firstPref && x != firstPref)
                return 1;
            // second pref
            else if (y == secondPref && x == secondPref)
                return 0;
            else if (x == secondPref && y != secondPref)
                return -1;
            else if (y == secondPref && x != secondPref)
                return 1;
            // third pref
            else if (y == thirdPref && x == thirdPref)
                return 0;
            else if (x == thirdPref && y != thirdPref)
                return -1;
            else
                return string.Compare(x, y);
        }
    }
0
ответ дан James 27 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: