Перебирайте свойства класса, как:
pubic string ConstructDays(DaysDetails d)
{
int Idx = 0;
string days = "";
var obj = new DaysDetails ();
foreach (var p in obj .GetType().GetProperties())
{ days += (bool)p.GetValue(obj ) ? (days=="" ? Idx.ToString() : ","+Idx.ToString()) : "";
Idx++;
}
return days
}
То, что Вы действительно хотите, логически невозможно. Нет никакого независимого от локали, нечувствительного к регистру способа отсортировать строки. Простой контрпример является "i" <> "I"? Наивный ответ не, но на турецком языке эти строки неравны. "i" является uppercased к "İ" (U+130 Latin Capital I с точкой выше)
Строки UTF-8 добавляют дополнительную сложность к вопросу. Они - совершенно допустимый многобайтовый символ* строки, если у Вас есть соответствующая локаль. Но ни C, ни стандарт C++ не определяют такую локаль; согласуйте со своим поставщиком (слишком много встроенных поставщиков, извините, никакой общий ответ здесь). Таким образом, необходимо выбрать локаль, многобайтовое кодирование которой является UTF-8, чтобы функция mbscmp работала. Это, конечно, влияет на порядок сортировки, который является зависимым локали. И если у Вас нет локали, в которой символ константы* является UTF-8, Вы не можете использовать этот прием вообще. (Насколько я понимаю CRT Microsoft страдает от этого. Их многобайтовый код только обрабатывает символы до 2 байтов; UTF-8 нужно 3)
wchar_t не является стандартным решением также. Это, предположительно, столь широко, что Вы не должны иметь дело с многобайтовой кодировкой, но Ваше сопоставление будет все еще зависеть от локали (LC_COLLATE). Однако использование wchar_t означает, что Вы теперь выбираете локали, которые не используют UTF-8 для константы char*.
Со сделанным, можно в основном записать собственное упорядочивание путем преобразования строк в нижний регистр и сравнения их. Это не прекрасно. Вы ожидаете L "ß" == L "ss"? Они даже не та же длина. Все же для немца необходимо считать их равными. Можно ли жить с этим?
Я не думаю, что существует стандартная библиотечная функция C/C++, которую можно использовать. Вы будете иметь к самокрутке или пользоваться сторонней библиотекой. Полная спецификация Unicode для определенного для локали сопоставления может быть найдена здесь: http://www.unicode.org/reports/tr10/ (предупреждение: это - длинный документ).
В Windows можно звонить, возвращаются к функции ОС CompareStringW и используют флаг NORM_IGNORECASE. Необходимо будет преобразовать строки UTF-8 в UTF-16 сначала. Иначе смотрите на Международные Компоненты IBM для Unicode.
Я полагаю, что Вы будете нуждаться к самокрутке или пользоваться сторонней библиотекой. Я рекомендую стороннюю библиотеку, потому что существует много правил, которые должны сопровождаться, чтобы заставить истинную международную поддержку - лучше всего позволять кому-то, кто опытное соглашение с ними.
У меня нет категорического ответа в форме примера кода, но я должен указать, что поток байтов UTF-8 содержит, на самом деле, символы Unicode, и необходимо использовать wchar_t версии библиотеки времени выполнения C/C++.
Необходимо преобразовать те байты UTF-8 в строки wchar_t сначала, все же. Это не очень твердо, поскольку стандарт кодировки UTF-8 очень хорошо документируется. Я знаю это, потому что я сделал это, но я не могу совместно использовать тот код с Вами.
Если Вы используете его, чтобы сделать поиск и сортировку для Вашей локали только, я предлагаю, чтобы Ваша функция вызвала простую функцию замены, которые преобразовывают обе байтовых строки в одного байта за символ с помощью таблицы как:
A-> a
Ã-> a
á-> a
ß-> ss
Ç-> c
и так далее
Затем просто назовите strcmp и возвратите результаты.