У меня есть большой набор данных, для которых вычисление ключа сортировки довольно дорого. То, что я хотел бы сделать, это использовать шаблон DSU, где я беру строки и вычисляю ключ сортировки. Пример:Decorate-Sort-Undecorate, как сортировать алфавитное поле в порядке убывания
Qty Name Supplier
Row 1: 50 Widgets IBM
Row 2: 48 Thingies Dell
Row 3: 99 Googaws IBM
Для сортировки по количеству и Поставщиком я мог иметь ключи сортировки: 0050 IBM
, 0048 Dell
, 0099 IBM
. Цифры выровнены по правому краю, а текст выравнивается по левому краю, при необходимости все заполняется.
Если мне нужно сортировать по QUANTY в убыванию заказ я могу просто вычесть значение из константы (например, 10000) для создания ключей сортировки: 9950 IBM
, 9952 Dell
, 9901 IBM
.
Как быстро и дешево построить нисходящую клавишу для alphabetic полей в C#?
[Мои данные все 8-битный ASCII ж/символов расширения ISO 8859.]
Примечание: В Perl, это может быть сделано bit-complementing the strings:
$subkey = $string^("\xFF" x length $string);
Портирование это решение прямо в C# не работает:
subkey = encoding.GetString(encoding.GetBytes(stringval).
Select(x => (byte)(x^0xff)).ToArray());
Я подозреваю, из-за различий в способе, которым обрабатываются строки в C#/Perl. Возможно, Perl сортируется в порядке ASCII, а C# пытается быть умным?
Вот пример кусок кода, который пытается выполнить это:
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
List<List<string>> sample = new List<List<string>>() {
new List<string>() { "", "apple", "table" },
new List<string>() { "", "apple", "chair" },
new List<string>() { "", "apple", "davenport" },
new List<string>() { "", "orange", "sofa" },
new List<string>() { "", "peach", "bed" },
};
foreach(List<string> line in sample)
{
StringBuilder sb = new StringBuilder();
string key1 = line[1].PadRight(10, ' ');
string key2 = line[2].PadRight(10, ' ');
// Comment the next line to sort desc, desc
key2 = encoding.GetString(encoding.GetBytes(key2).
Select(x => (byte)(x^0xff)).ToArray());
sb.Append(key2);
sb.Append(key1);
line[0] = sb.ToString();
}
List<List<string>> output = sample.OrderBy(p => p[0]).ToList();
return;
Почему вы не можете просто изменить порядок сортировки? Либо используйте больше, чем вместо менее или пропускайте в «IComparer», который работает обратным образом, или что-то подходящее для вашей конкретной ситуации сортировки. – Auraseer
Потому что это сложнее, чем это. Представьте, что этот ключ сортировки содержит 10 частей (вместо двух в примере), а 3, 6 и 9 части ключа должны сортироваться в порядке возрастания, а остальные - в порядке убывания. –