我有一个 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
是字符串。所以我在这里遇到问题。
如何解决这个问题?
答案 0 :(得分:2)
您只需先使用DateTime.Parse
将string
解析为DateTime
:
var nearestDiff = getAlldates
.Select(x => DateTime.Parse(x)) // this one
.Min(date => Math.Abs((date - targetDate).Ticks));
或改进版本,感谢Gusdor和Jeppe 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()));
}