2017-03-21 31 views
-1

我想排序字符串列表。預排序的字符串下面的例子:通過比較字符串的日期時間部分對字符串列表進行排序

「2017年3月21日17:14:36.111我喜歡紅」
「2017年3月21日17:14:35.333我喜歡黃色」
「 2017-03-21 17:14:36.111我喜歡Green「

我想僅使用datetime子串對列表進行排序。

private void MergeAndSort(string[] lines1, string[] lines2) 
{ 
    var entries = new List<string>(); 
    entries.AddRange(lines1); 
    entries.AddRange(lines2); 
    entries.Sort(); 
    foreach (string entry in entries) 
    { 
     CombinedrichTextBox.AppendText(entry); 
    } 
} 
+2

這個問題的哪一部分是你遇到麻煩?分隔出字符串的日期部分,還是按自定義條件排序? – StriplingWarrior

+1

你可以創建一個自定義比較器http://stackoverflow.com/a/3119474/1454658 –

+0

那麼爲什麼35之間的「預先排序的字符串」36? – Slai

回答

0

假設你的日期/時間字符串長度保持不變,你可以這樣做。

 string[] entries = 
     { 
      "2017-03-21 17:14:36.380 I like Red", 
      "2017-03-21 17:14:35.380 I like Yellow", 
      "2017-03-21 17:14:36.380 I like Green" 
     }; 

     var data = new List<Tuple<DateTime, string>>(); 

     foreach (var entry in entries) 
     { 
      data.Add(
       new Tuple<DateTime, string>(DateTime.Parse(entry.Substring(0, 23)), 
       entry.Substring(23))); 
     } 

     var sorted = data.OrderBy(e => e.Item1); 
     entries = sorted.Select(e => $"{e.Item1} {e.Item2}").ToArray(); 
+0

我更新了示例字符串以顯示需要保持毫秒。有沒有辦法保持字符串不變,只能根據每個字符串中的前23個字符進行排序? –

+0

爲什麼你不能在給我的例子排序後將字符串拼接在一起? – Ahsan

+0

剛剛添加的最後一行顯示瞭如何連接。 – Ahsan

0

有關標準DateTime字符串的很酷的事情是,您不需要轉換它們以便對它們進行排序。你可以對字符串進行排序。

那麼你的問題在於搞清楚日期/時間字符串在哪裏。你可以像Ahsan建議的那樣使用字符串中的位置。您可以查找字符串中的第一個字母。這取決於實際的字符串,而不僅僅是例子的樣子。

我可以在一個C#語句中執行此操作嗎?你打賭!

var sorted = lines1 
    .concat(item2) 
    .Sort((a,b) => string.Compare(a.Substring(0,23), b.Substring(0,23))) 
    .ToList(); 

這個例子是一個有點草率,因爲它假定總是會有在每個字符串的前一個標準的日期,而這往往是一個危險的假設。如果您還假設DateTime字符串都是唯一的,並且毫秒分辨率表明它們是,那麼您不需要執行子字符串,而只需使用Sort()。

+0

我更新了示例字符串以顯示需要保持毫秒。有沒有辦法保持字符串不變,只能根據每個字符串中的前23個字符進行排序? –

+0

當然。我們的示例按字符串的前23個字符按日期/時間排序,如您從調用Substring所看到的。 –