簡體   English   中英

如何檢查列表中是否已存在相同的日期?

[英]How can I check if the same Date is already in a List?

我有一個日期時間列表(有時間和日期),現在需要一個方法來將所有獨特的日子帶到一個單獨的列表中
例:

[1.1.2015 12:34]    [1.1.2015 12:34]   [1.1.2015 12:34]
[1.2.2015 4:34]     [1.2.2015 2:34]     [1.2.2015 1:34]
[1.3.2015 8:34]     [1.3.2015 1:34]     [1.6.2015 2:34]  

需要變成:

[1.1.2015 0:0]    [1.2.2015 0:0]    [1.3.2015 0:0]    [1.6.2015 0:0]

我該怎么做呢?

DateTime.Date和Enumrable.Distinct是一個選項(假設您不需要保持順序):

var dates = dateAndTimes.Select(d => d.Date).Distinct().ToList();

Distinct可能,但不必保留項目的順序(我相信當前的實施將保持秩序)。

如果您需要正式保證原始訂單 - 如果列表已經排序,則重新排序( OrderBy ),或者迭代原始列表中的項目並添加到列表中尚未包含的新列表(類似於Distinct內部的操作,但保證您的代碼行為)。

請注意,根據Tim Schmelter對使用類似newList.Contains(itemAboutToBeAdded)類的項目保持順序的評論非常慢(並且因為您需要檢查項目是否按當前正在構建的順序而變得笨拙),使用類似的常規foreach以下是Distinct提供的數學O(n)表現以及正式的訂單保證:

 var dates = dateAndTimes.Select(d => d.Date);
 var alreadyInList = new HashSet<DateTime>();
 var datesInSameOrder = new List<DateTime>();
 foreach(var date in dates)
 {
    if (!alreadyInList.Contains(date))
    {
        alreadyInList.Add(date);
        datesInSameOrder.Add(date);
    }
 }

可以編寫較短的版本以依賴HashSet.Add如果item已存在則返回false的事實:

var alreadyInList = new HashSet<DateTime>();
var datesInSameOrder = dates.Where(date => alreadyInList.Add(date)).ToList();

或者,即使依賴HashSet中項目順序的實現細節與Add調用的順序相同(正式順序未定義,因此使用風險自負, Distinct具有相同的行為 - 所以沒有任何好處):

 var datesInSameOrder = new HashSet<DateTime>(dates).ToList();

您可以在Date屬性上對它們進行分組並投影所有鍵:

var dates = dateandTimes.GroupBy(x=> x.Date)
                        .Select(x=>x.Key).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM