C#:自定义数组排序

时间:2009-05-01 22:15:39

标签: c# arrays sorting

我想在给定自定义映射的情况下对目录中的字符串数组进行排序(它实际上是基于其扇区的股票名称排序)。我不确定用于表示映射的数据结构,以及如何编写自定义排序方法。

例如,假设我有以下字符串数组:

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 个答案:

答案 0 :(得分:7)

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 :(得分:1)

嗯......好像你的地图以可用的格式显示,你可以写一个自定义的IComparer实现并将其交给Array.Sort。也许我在你的问题中遗漏了一些重要的细节?