2012-04-03 4 views
1

у меня есть список строк, как этотбыстрый способ сортировки списка строк

«FirstName-LastName» (через тире -)

Мне нужно отсортировать его этот список по имени, а затем по фамилия

Каков наилучший способ для этого. Мне нужно обработать 30000 строк менее чем за 1 секунду.

Мне предлагалось использовать LINQ to Entities.

Каков наилучший способ использования этого?

Большое спасибо за любую помощь

EDIT: чтобы избежать путаницы вход List<string>

+0

L2E? Являются ли данные в базе данных или в памяти? –

+0

Откуда берутся данные? – mellamokb

+2

пожалуйста, покажите исходный код som ... что у вас есть? – Yahia

ответ

3

Вы можете использовать LINQ (который позволит сортировать без изменения данных в списке):

names.OrderBy(s => s.Split('-')[0]).ThenBy(s => s.Split('-')[1]); 
+0

@NiklasB. - Зависит от желаемого поведения, если первые имена перекрываются. Рассмотрим «Сэм-Джонс» и «Саманта-Смит». Просто называть OrderBy без разделения значений поставил бы Саманту впереди Сэма, но я ожидал бы, что Сэм придет первым. –

+0

Я думаю, что вы имели в виду (Last then First name): 'names.OrderBy (s => s.Split ('-') [1]). ThenBy (s => s.Split ('-') [0]) ; ' –

+0

@anderson: Нет, это имя, а затем фамилия, в соответствии с вопросом. –

0

Разделите массив строк в 26 подмассивов, по одному для каждой буквы алфавита. Затем повторите процесс для каждого подмассива.

Этот метод очень эффективен для сортировки строк. Он известен как bucket sort.

+0

Я бы использовал одну из функций сортировки фреймов и только рулон мой собственный вид, если были веские причины полагать, что а) программа не достаточно быстро уже и б) новая функция сортировки будет иметь большее значение чем некоторые другие улучшения производительности. Достаточно кратных случаев, что вероятность ошибки просто не стоит того, чтобы я считал, что я уверен, что сортировка быстрого/слияния использует фреймворк * достаточно быстро *. – Servy

+0

@Servy: Для строк '30000' это, вероятно, не имеет значения. Но для действительно больших наборов строк я нашел, что сортировка ковша является огромной производительностью. – Dennis

+0

Я не сомневаюсь, что это быстрее, я просто утверждаю, что * в этом случае * выгода не стоит риска. Если бы было рамочное решение, использующее сортировку Radix, или если были убедительные доказательства того, что производительность была необходима, то она будет использоваться. Поскольку это может быть правдой в какой-то будущей точке (или для других читателей), это не * неверный * ответ (отсюда нет -1 от меня). – Servy

2

Вы можете также использовать делегаты

names.Sort(
    delegate(string str1, string str2) 
    { 
     return str1.CompareTo(str2); 
    } 
); 
Смежные вопросы