gpt4 book ai didi

c# - 如何检查相同的日期是否已在列表中?

转载 作者:行者123 更新时间:2023-11-30 19:57:26 26 4
gpt4 key购买 nike

我有一个 DateTimes 列表(带有时间和日期),现在需要一种方法来将所有独特的日子从中提取到一个单独的列表中
示例:

[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 将数学 O(n) 性能由 Distinct 提供以及 formal 顺序保证:

 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 如果项目已经存在则返回 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();

关于c# - 如何检查相同的日期是否已在列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29948006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com