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