我目前正在研究一個項目,我需要按照某種方案對元組列表中的條目進行排序。 爲此我寫了一個簡單的IComparer:IComparer沒有正確排序
private class OrderComparer : IComparer<Tuple<string, DateTime, string>>
{
public int Compare(Tuple<string, DateTime, string> x, Tuple<string, DateTime, string> y)
{
var yearX = x.Item1.Substring(x.Item1.Length - 2);
var yearY = y.Item1.Substring(y.Item1.Length - 2);
var monthX = x.Item1.Substring(x.Item1.Length - 4, 2);
var monthY = y.Item1.Substring(y.Item1.Length - 4, 2);
var numberX = x.Item1.Substring(1, x.Item1.Length - 5);
var numberY = y.Item1.Substring(1, y.Item1.Length - 5);
if (!yearX.Equals(yearY))
{
return Convert.ToInt32(yearX).CompareTo(Convert.ToInt32(yearY));
}
if (!monthX.Equals(monthY))
{
return Convert.ToInt32(monthX).CompareTo(Convert.ToInt32(monthY));
}
return Convert.ToInt32(numberX).CompareTo(Convert.ToInt32(numberY));
}
}
在調試會話發現yearX/Y,monthX/Y和numberX/Y的讀數正常工作。
我現在面臨的問題是它在年份和月份之後正確排序,而不是數字。 我驗證,即
return Convert.ToInt32(numberX).CompareTo(Convert.ToInt32(numberY));
返回正確的值(1當numberx>相numberY)。
我請使用以下代碼的排序方法:
var dataList = data as IList<Tuple<string, DateTime, string>> ?? data.ToList();
dataList.ToList().Sort(new OrderComparer());
,其中數據是一個IEnumerable。
我很抱歉,這個相當簡單的問題,但我完全卡住了,我沒有看到我的執行中的任何錯誤。 親切的問候
Lukas 編輯:由於樣本數據是必要的。這裏的算法失敗的數據: B080114, B140114, B100114, B160114, B130114
這是排序
爲了不使用基於'String'的複雜排序操作,爲什麼不首先將它解析爲'DateTime',這可能會提高速度......'DateTime'具有內建的可比性。然後,你可以排序,而無需實施自己的比較。 –
你可以提供一些它失敗的示例數據(我們可以複製並粘貼來重現你的問題)? – Chris
剛剛編寫了一些測試數據,它似乎適用於我...我的測試數據在第二部分和第三部分中有不相關的數據,第一部分有字符串'{「010114」,「020114」,「010214 「,」020314「,」010113「,」010213「,」020113「}'。您的比較器按第5位和第6位(年),第3位和第4位(月)和第2位(數字)正確排序。這意味着你沒有展示或解釋正確的東西。例如,數字意味着只是字符串的第二個數字? – Chris