如何获得最近的约会?

时间:2015-07-27 08:01:02

标签: c# linq date datetime min

我有一个 LayoutInflater.from(parent.getContext()).inflate(R.layout.nav_drawer_row, parent, false); 的日期列表。用户输入的日期将与日期列表进行比较。

如果列表包含该特定日期,则目标日期将是该日期。如果列表不包含该特定日期,则应将最近的日期作为目标日期。

为此,我尝试在LINQ中使用List

Min

但我的var nearestDiff = getAlldates.Min(date => Math.Abs((date - targetDate).Ticks)); var nearest = getAlldates.Where(date => Math.Abs((date - targetDate).Ticks) == nearestDiff).First(); 是一个列表,getAlldates是字符串。所以我在这里遇到问题。

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您只需先使用DateTime.Parsestring解析为DateTime

var nearestDiff = getAlldates
                  .Select(x => DateTime.Parse(x)) // this one
                  .Min(date => Math.Abs((date - targetDate).Ticks));

或改进版本,感谢GusdorJeppe Stig Nielsen

的输入
getAlldates.Min(x => (DateTime.Parse(x) - targetDate).Duration());

如果日期格式不是当前文化的格式,您可能需要指定日期格式或文化以使用解析。 (您可能希望使用DateTime.ParseExact

答案 1 :(得分:1)

您没有指定,但我猜日期列表是System.DateTime对象的列表。如果targetDate对象是字符串,则无法从System.DateTime中减去。您显示的代码部分将无法编译:

List<System.Datetime> allDates = ...;
string targetDate = ...;
var nearestDiff = getAlldates.Min(date => Math.Abs((date - targetDate).Ticks));

要编译它,您应该将targetDate转换为System.DateTime。如果您确定targetDate中的文本表示System.DateTime,那么您可以使用System.DateTime.Parse(string),否则使用TryParse。

代码可能会像:

List<System.Datetime> allDates = ...;
string targetDateTxt = ...;
System.DateTime targetDate = System.DateTime.Parse(targetDateText)
System.DateTime nearestDiff = getAlldates.Min(date => Math.Abs((date - targetDate).Ticks));

从这里开始,其他代码正常工作

答案 2 :(得分:0)

这是一个静态方法,它将返回最近的日期。

    /// <summary>
    /// Get the nearest date from a range of dates.
    /// </summary>
    /// <param name="dateTime">The target date.</param>
    /// <param name="dateTimes">The range of dates to find the nearest date from.</param>
    /// <returns>The nearest date to the given target date.</returns>
    static DateTime GetNearestDate(DateTime dateTime, params DateTime[] dateTimes)
    {
        return dateTime.Add(dateTimes.Min(d => (d - dateTime).Duration()));
    }