Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含doen';t签入日期范围_C# - Fatal编程技术网

C# 包含doen';t签入日期范围

C# 包含doen';t签入日期范围,c#,C#,我有一个这样的日期范围, string ActualReleaseDates ="7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; string NewsReleasedDate ="07/11/2016"; 我想检查NewsReleaseDate是否在实际ReleaseDates内 但在下面的代码中,它返回为false if (ActualReleaseDates.Split(',

我有一个这样的日期范围,

string ActualReleaseDates ="7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
string NewsReleasedDate ="07/11/2016";
我想检查NewsReleaseDate是否在实际ReleaseDates内

但在下面的代码中,它返回为false

if (ActualReleaseDates.Split(',').Contains(NewsReleasedDate.TrimStart(new Char[] { '0' })))
{
    //some code here
}

空白问题。您可以使用
trim()

    var ActualReleaseDates = "7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
    var NewsReleasedDate = "07/11/2016";

    var splitActualReleaseDates = ActualReleaseDates.Split(',').Select(x => x.Trim());

    if (splitActualReleaseDates.Contains(NewsReleasedDate.TrimStart(new Char[] { '0' })))
    {

    }
直接的问题是,在拆分
ActualReleaseDates
字符串后,没有
“7/11/2016”
。。。取而代之的是一个条目
“7/11/2016”
。。。注意空格

但更根本的是,如果值类似于“07/08/2016”,那么仅仅调整
NewsReleasedDate
的开头将无济于事。。。您应该将这些值处理为日期,而不是字符串:

  • 用逗号拆分
    ActualReleaseDates
    ,然后以适当的格式(我怀疑是
    M/d/yyyy
    )解析每个值(在删减空格后),以便得到一个
    列表
  • 以适当的格式解析
    NewsReleasedDate
    ,我怀疑是
    MM/dd/yyyy
    ,因此您会得到一个
    DateTime
  • 查看第二步的解析值是否出现在第一步的列表中
(我个人建议使用和解析
LocalDate
值,但我有偏见……)


从根本上说,您试图查看一个日期是否出现在日期列表中。。。因此,请确保尽早将数据转换为最合适的表示形式。理想情况下,完全避免使用字符串。。。我们不知道您的数据来自何处,但如果它以另一种表示形式开始并被转换为文本,请查看是否可以避免这种转换。

您可以使用linq将字符串转换为DateTime对象,并比较它们而不是字符串

string ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
string NewsReleasedDate ="07/11/2016";

var releaseDates = ActualReleaseDates.Split(',').Select(x => DateTime.Parse(x));
var newsReleased = DateTime.Parse(NewsReleaseDate);

if (releaseDates.Contains(newsReleased))
{
    //some code here
}

请注意,DateTime分别解析为当前区域性。如果要指定确切的日期格式,可以使用DateTime.ParseExact。

在执行以下查询之前,可以使用DateTime:

(我认为这是比较日期最准确、最有保证的方法)

Func stringToDate=s=>DateTime.ParseExact(s.Trim(),“M/d/yyyy”,
文化信息(不变量文化);
DateTime newReleaseDateTime=stringToDate(NewsReleaseDate);
bool result=ActualReleaseDates.Split(',')。选择(x=>stringToDate(x))
.包含(newReleaseDateTime);

它返回false,因为存储在NewsReleaseDate中的日期为2016年11月7日数据存储为字符串,开头带有“0”。在ActualReleaseDates字符串中,“,”和数字之间有空格

尝试重写这些字符串,如下所示:

ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; // white spaces removed.
NewsReleasedDate ="7/11/2016"; // 0 removed
变量如下:

ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; // white spaces removed.
NewsReleasedDate ="7/11/2016"; // 0 removed
这是我的代码示例:

 string ActualReleaseDates = "7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
 string NewsReleasedDate = "7/11/2016";
 string[] dates = ActualReleaseDates.Split(',');
 Console.WriteLine(dates.Contains(NewsReleasedDate));

这不是比较日期的最佳方法,您可以使用Date类来进行此类比较。

根据您自己的数据,它也不包含在内。查看字符串时,2016年11月7日
与2016年11月7日
不同。汉森:这大概就是为什么会有“TrimStart”调用,尽管这对我来说似乎是一种非常糟糕的方式,因为它不会处理“2016年8月7日”@JonSkeet那么什么是更好的方法?你能创建一个日期时间数组而不是字符串数组吗?@AllanS.Hansen:同意。我已经添加了一个提到这一点的答案,但还有更大的问题…@TechGuy:不,恐怕我已经有足够多的精力专注于我最擅长的方面(语言功能)。这段对话现在偏离了主题。我建议我们都删除这里的评论。。。