Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中字符串数组的自定义排序#_C#_Arrays - Fatal编程技术网

C# C中字符串数组的自定义排序#

C# C中字符串数组的自定义排序#,c#,arrays,C#,Arrays,我有一个字符串数组或arraylist,用C#传递给我的程序。下面是这些字符串所包含内容的一些示例: “Spr 2009” “2006年总额” “2010年秋季” “2007年秋季” 我希望能够按照年份和季节对阵列进行排序。有没有一种方法可以编写排序函数,告诉它先按年份排序,然后按季节排序。我知道如果它们是分开的会更容易些,但我无法控制给我的是什么。您需要编写一个方法,以适当的方式比较任意两个字符串,然后您可以将该方法转换为比较委托以传递到数组中。排序: public static int Co

我有一个字符串数组或arraylist,用C#传递给我的程序。下面是这些字符串所包含内容的一些示例:

“Spr 2009” “2006年总额” “2010年秋季” “2007年秋季”


我希望能够按照年份和季节对阵列进行排序。有没有一种方法可以编写排序函数,告诉它先按年份排序,然后按季节排序。我知道如果它们是分开的会更容易些,但我无法控制给我的是什么。

您需要编写一个方法,以适当的方式比较任意两个字符串,然后您可以将该方法转换为
比较
委托以传递到
数组中。排序

public static int CompareStrings(string s1, string s2)
{
    // TODO: Comparison logic :)
}
...

string[] strings = { ... };
Array.Sort(strings, CompareStrings);
您也可以对通用列表执行相同的操作:

List<string> strings = ...;
strings.Sort(CompareStrings);
列出字符串=。。。;
strings.Sort(CompareStrings);

您可以随时将它们分开。创建名称-值-值三元组,并像那样使用它们。如果数据格式一致,则使用左字符串函数和右字符串函数。然后你先按年份排序,然后按季节排序。尽管Jon的想法看起来很好,但这是在该方法中添加内容的一个想法。

您可以按空格字符分割字符串,将两部分转换为整数,然后使用LINQ:

string[] seasons = new[] { "Spr", "Sum", "Fall", "Winter" };

string[] args = new[] { "Spr 2009", "Sum 2006", "Fall 2010", "Fall 2007" };

var result = from arg in args
             let parts = arg.Split(' ')
             let year = int.Parse(parts[1])
             let season = Array.IndexOf(seasons, parts[0])
             orderby year ascending, season ascending
             select new { year, season };

我相信你要找的是课堂


我还考虑了Array.Sort,这可能会快一点,但您也提到有时这些是ArrayList。

这是有效的,只是它按字母顺序排列季节,而不是按季节顺序排列。代码按季节数组中季节的索引排列,而不是按字母顺序排列。
var strings = new string[] {"Spr 2009", "Sum 2006", "Fall 2010", "Fall 2007"};
var sorted = strings.OrderBy(s => 
{
    var parts = s.Split(' ');
    double result = double.Parse(parts[1]);
    switch(parts[0])
    {
        case "Spr":
            result += .25;
            break;
        case "Sum"
            result += .5;
            break;
        case "Fall":
            result += .75;
            break;
    }
    return result;
});