C #: сортировка пользовательских массивов - PullRequest
1 голос
/ 02 мая 2009

Я хотел бы отсортировать массив строк в каталоге, учитывая пользовательское сопоставление (на самом деле это сортировка названий акций на основе их сектора) Я не уверен, какие структуры данных использовать для представления сопоставления и как написать собственный метод сортировки.

Например, предположим, у меня был следующий строковый массив:

string[] fileNames = "bac.csv", "c.csv", "cvx.csv", "java.csv", "msft.csv", "xom.csv";

А вот и отображения:

{"bac", "c"} => 0
{"msft", "java"} => 1
{"xom", "cvx"} => 2

Я бы хотел, чтобы string [] customSort (string [] fileNames) возвращала следующее:

"bac.csv", "c.csv", "java.csv", "msft.csv", "xom.csv", "cvx.csv"

Какую структуру данных вы бы использовали для представления отображений, и каков элегантный способ написания метода сортировки?

Ответы [ 2 ]

7 голосов
/ 02 мая 2009

Array.Sort позволяет указать массив ключей, чтобы вы могли сделать что-то вроде ...

int[] keys = new int[fileNames.Length];

Dictionary<string, int> mapping = new Dictionary<string, int>(StringComparer.CurrentCultureIngoreCase);

// set up our mappings like so
mapping.Add("bac", 0);
mapping.Add("c", 0);
mapping.Add("msft", 1);
mapping.Add("java", 1);
mapping.Add("xom", 2);
mapping.Add("cvx", 2);
// etc

for(int i=0; i < keys.Length; i++)
{
    string token = System.IO.Path. GetFileNameWithoutExtension(fileNames[i]);

    int mappingKey;

    if(!mapping.TryGetValue(token, out mappingKey)) mappingKey = int.MaxValue;

    keys[i] = mappingKey; 
}

Array.Sort<int, string>(keys, fileNames);

Просто измените оператор keys[i] = -1;, чтобы получить правильное значение из ваших отображений с учетом переменной token.

1 голос
/ 02 мая 2009

Гм ... кажется, что если у вас есть отображение в пригодном для использования формате, вы можете просто написать собственную реализацию IComparer и передать ее Array.Sort . Может быть, я упускаю некоторые важные детали в вашем вопросе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...