【发布时间】:2014-03-21 13:48:33
【问题描述】:
我正在尝试对一个制表符分隔的字符串数组进行排序。我在每个元素的制表符上调用 split 函数以将字符串分解为字符串数组。然后我对日期元素进行比较以返回它们应该在的顺序。如果日期相等,我对字符串字段进行二次比较。我的 IComparer 接口实现如下所示:
class CompareLines : IComparer<string>
{
public int Compare(string x, string y)
{
string[] bSplitX = x.Split('\t');
string[] bSplitY = y.Split('\t');
int bYearX = Int32.Parse(bSplitX[4].Substring(4, 4));
int bMonthX = Int32.Parse(bSplitX[4].Substring(0, 2));
int bDayX = Int32.Parse(bSplitX[4].Substring(2, 2));
int bYearY = Int32.Parse(bSplitY[4].Substring(4, 4));
int bMonthY = Int32.Parse(bSplitY[4].Substring(0, 2));
int bDayY = Int32.Parse(bSplitY[4].Substring(2, 2));
DateTime bTempDateX = new DateTime(bYearX, bMonthX, bDayX);
DateTime bTempDateY = new DateTime(bYearY, bMonthY, bDayY);
if (DateTime.Compare(bTempDateX, bTempDateY) > 0)
{
return 1;
}
else if (DateTime.Compare(bTempDateX, bTempDateY) < 0)
{
return -1;
}
else if (DateTime.Compare(bTempDateX, bTempDateY) == 0)
{
if (String.Compare(bSplitX[3], bSplitY[3]) > 0)
{
return 1;
}
else
{
return -1;
}
}
else
{
Console.WriteLine("ahhh wtf"); //should never be reached. This message has never appeared in my console.
return 0;
}
}
}
我的问题是它有时会起作用,而其他时候不起作用。有没有人有任何理由说明上述代码不能 100% 工作?
这几天一直在伤害我的大脑,我真的不明白为什么它不起作用。
【问题讨论】:
-
如果不起作用会怎样?
-
你为什么要自己解析日期,而不是使用
DateTime.ParseExact?在没有任何有关输入、预期输出或出错时会发生什么信息的情况下,您希望我们如何为您提供帮助? -
我不知道 ParseExact。输入是一个字符串数组。相关字段是一个字符串(位置 4 的元素),表示 MMddyyyy 格式的日期和一个任意字符串,以比较日期是否相等(位置 3 的元素。示例可能是“f”“e”“c”等. 它们可以有多个字符,这就是它们是字符串的原因)预期的输出是按日期升序排序的数组,如果日期匹配,则其次是按字符串排序。我不确定到底出了什么问题。日期是为了某个点然后未定义(可能是 2008 年到 2010 年到 2009 年)
-
您知道这些日期在数学上是最适合比较的格式吗?一秒钟,我会证明我的意思......
-
@Dave yyyyMMdd 将是比较的最佳选择,实际上是我之前正在做的,但它仍然无法正常工作。我可能会将其改回 int 比较,而不是创建 DateTime 对象以提高性能。