2015-05-27 36 views
1

我讀的許多日誌文件中的文本行,並將它們全部加入到一個名爲lstMerged行的列表不輸出。我現在想要做的是將這個合併的行列表輸出到一個合併文件中,按照日期和時間的順序。我第一次嘗試是有點像這樣合併的列表:合併的行列表中的預計日期時間順序

List<Lines> lstMerged = new List<Lines>(); 
    foreach (var item in logs) 
    { 
    lstMerged.AddRange(item.lstLines);//Pass lstLines items in all Logs into a single list lstMerged 
    } 
    lstMerged.Sort((x, y) => DateTime.Compare(x.DateTime, y.DateTime)); 

這是不正確的工作,因爲這有着完全相同的第二或毫秒線隨機輸出。例如,如果在日期和時間完全相同的兩個不同日誌文件中存在10行文本(毫秒),則這些行現在是隨機排序的,即它們不是它們在原始文件中出現的順序。

我想整理日期和時間的所有行,但如果有很多行具有相同的日期和時間,然後我希望他們出現在同一順序與原始日誌文件。任何人都可以看到我的嘗試有什麼問題嗎?

+0

可以提供數據的一個小樣本的問候被隨機輸出可以顯示的代碼參照'lstMerged',你是如何加入項目的人.. – MethodMan

+0

其實這似乎是排序的自然方式。您應該在作爲日誌文件索引的排序或日誌文件中行的索引中添加一個附加參數。 –

回答

4

Sort使用快速排序算法,這是不穩定的,因此與相同值的項目可能比原來不同的位置結束。

List.Sort Method (Comparison)

此實現執行不穩定排序;即如果兩個 元素相等,則它們的順序可能不會保留。相比之下, 穩定的排序保留了相同元素的順序。

使用Enumerable.OrderBy它提供穩定的分類。

此方法執行穩定排序;也就是說,如果兩個 元素的鍵相等,則元素的順序將被保留。

lstMerged = lstMerged.OrderBy(x=> x.DateTime).ToList(); 
+0

我實際上嘗試這樣做:lstMerged.OrderBy(DT => dt.DateTime).ThenBy(DT => DateTime.Parse(dt.DateTime.ToShortTimeString()));但它會一個接一個地返回日誌,而不是全部合併在一起。 – NepSyn14

+0

@ NepSyn14,我不知道你想用'.ThenBy(dt => DateTime。Parse(dt.DateTime.ToShortTimeString()));',沒有必要,'DateTime'字段上的'OrderBy'將按日期和時間進行排序。 – Habib

+0

@ NepSyn14,使用'lstMerged = lstMerged.OrderBy(x => x.DateTime).ToList();' – Habib

5

您正在使用List.Sort()它採用了快速排序算法並不穩定。

的LINQ的排序採用了穩定的排序算法,所以你可以嘗試使用,而不是:

lstMerged = lstMerged.OrderBy(x => x.DateTime).ToList(); 
+0

當我構建它時,會返回以下錯誤。錯誤無法根據用法推斷方法「System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable ,System.Func )'的類型參數。嘗試明確指定類型參數。 – NepSyn14

+0

@ NepSyn14嘗試更新的代碼。如果不能訪問實際的類型,就很難編寫正確的代碼。 ) –

相關問題