Есть две отдельные ошибки.
Во-первых, вы забыли добавить main.cpp
в ваш make-файл.
Во-вторых, ваш main.cpp
не содержит глобальной функции с именем main
. Функция-член класса с именем main
не подходит. Вам нужна функция с именем main
в глобальном пространстве имен с внешней связью.
При помещении предпочтений в список это могло бы стать легче.
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
из первого примера в большое количество.
Поместите предпочтительные значения в словарь. Поиск ключей в словаре является 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
);
Да, необходимо реализовать собственное IComparer<string>
и затем передайте его в как второй аргумент метода OrderBy LINQ.
Пример может быть найден здесь: Упорядочивание результаты LINQ
Решение 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);
}
}