【问题标题】:C#: custom array sortingC#:自定义数组排序
【发布时间】:2010-10-23 05:56:41
【问题描述】:

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

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

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"

您将使用什么数据结构来表示映射,以及编写排序方法的优雅方式是什么?

【问题讨论】:

    标签: c# arrays sorting


    【解决方案1】:

    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 变量的映射中获取正确的值。

    【讨论】:

    • 那需要我写:key["bac"] = 0;键[“c”]=0;键[“msft”]=1;键[“java”]=1;等等对吗?有没有更简洁的写法?
    • 不,你不会写这个。我将编辑代码以使其更清晰,也许更简洁。
    • 也许我做错了什么,但这并没有按应有的方式对数组进行排序。请参阅下面的答案。
    • 酷,做到了。感谢您的帮助。
    【解决方案2】:

    嗯...如果你的映射是可用格式的,你可以编写一个自定义的IComparer 实现并将其交给Array.Sort。也许我在你的问题中遗漏了一些重要的细节?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2012-06-15
      相关资源
      最近更新 更多