【发布时间】:2010-08-02 16:49:13
【问题描述】:
我有一个字符串数组或数组列表,它在 C# 中传递给我的程序。以下是这些字符串包含的一些示例:
“2009 年春季” 《2006年总和》 《2010 年秋季》 “2007 年秋季”
我希望能够按年份和季节对这个数组进行排序。有没有办法编写一个排序函数来告诉它按年份然后按季节排序。我知道如果他们分开会更容易,但我无法控制给我的东西。
【问题讨论】:
我有一个字符串数组或数组列表,它在 C# 中传递给我的程序。以下是这些字符串包含的一些示例:
“2009 年春季” 《2006年总和》 《2010 年秋季》 “2007 年秋季”
我希望能够按年份和季节对这个数组进行排序。有没有办法编写一个排序函数来告诉它按年份然后按季节排序。我知道如果他们分开会更容易,但我无法控制给我的东西。
【问题讨论】:
您需要编写一个以适当方式比较任意两个字符串的方法,然后您可以将该方法转换为Comparison<string> 委托以传递给Array.Sort:
public static int CompareStrings(string s1, string s2)
{
// TODO: Comparison logic :)
}
...
string[] strings = { ... };
Array.Sort(strings, CompareStrings);
您也可以对通用列表做同样的事情:
List<string> strings = ...;
strings.Sort(CompareStrings);
【讨论】:
您可以通过空格字符拆分字符串,将两个部分都转换为整数,然后使用 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 };
【讨论】:
您总是可以将它们分开。创建名称-值-值三元组并像这样使用它们。如果数据格式一致,请使用 Left 和 Right 字符串函数。然后你先排序年份部分,然后是季节部分。虽然 Jon 的想法看起来非常好,但这是在该方法中添加什么的一个想法。
【讨论】:
我相信您正在寻找的是 StringComparer 类。
【讨论】:
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;
});
我也考虑过 Array.Sort,可能会快一点,但你也提到有时这些是 ArrayList。
【讨论】: