繁体   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