[英]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.