0

我正在尝试使情况像这样:用户可以填写“just txtComStartDate”或“just txtComEndDate”或“txtComStartDate & txtComEndDate”。

如果用户填写txtComStartDate为 18/08/12,则仅显示 18/08/12 以后的数据。

如果用户填写txtComEndDate为 19/08/12,则仅显示 19/08/12 之前的数据。

如果用户同时限制txtComStartDate18/08/12 和txtComEndDate19/08/12,则会显示这两个日期之间的数据。

if声明给了我错误并且无法正常工作。我对&&and感到困惑||。有人可以帮忙吗?您的帮助将不胜感激。谢谢你。

我的代码:

private void searchComByDate()
{

    // Process the list of files found in the directory. 
    string[] fileEntries = Directory.GetFiles(sourceDir);
    foreach (string fileName in fileEntries)
    {
        XmlDocument xmlDoc = new XmlDocument(); //* create an xml document object.

        string docPath = fileName;

        xmlDoc.Load(docPath); //* load the XML document from the specified file.

        XmlNodeList nodeList = xmlDoc.GetElementsByTagName("item");

        foreach (XmlNode node in nodeList)
        {

            XmlElement itemElement = (XmlElement)node;

            string itemDate = itemElement.GetElementsByTagName("pubDate")[0].InnerText;
            CultureInfo provider = CultureInfo.InvariantCulture;
            if (txtComStartDate.Text != (String.Empty) && DateTime.Parse(itemDate) >= DateTime.ParseExact(txtComStartDate.Text, "dd/MM/yy", provider) 
                || txtComEndDate.Text != (String.Empty) && DateTime.Parse(itemDate) <= DateTime.ParseExact(txtComEndDate.Text, "dd/MM/yy", provider)
                || (txtComStartDate.Text != (String.Empty) && DateTime.Parse(itemDate) >= DateTime.ParseExact(txtComStartDate.Text, "dd/MM/yy", provider) && txtComEndDate.Text != (String.Empty) && DateTime.Parse(itemDate) <= DateTime.ParseExact(txtComEndDate.Text, "dd/MM/yy", provider)))
            {
                string itemAuthor = itemElement.GetElementsByTagName("author")[0].InnerText;
                string itemTitle = itemElement.GetElementsByTagName("title")[0].InnerText;
                string itemDescription = itemElement.GetElementsByTagName("description")[0].InnerText;
                string itemXMLFile = Path.GetFileNameWithoutExtension(fileName);

                richComByTemplate.AppendText("SYMBOL: " + itemXMLFile + "\nAUTHOR: " + itemAuthor + "\nDATE: " + itemDate + 
                                            "\nTITLE: " + itemTitle + "\nDESCRIPTION: " + itemDescription + "\n\n--------\n\n");
            }
        }
    }
}
4

5 回答 5

2

可能是这样的。伪代码

DateTime startDate = DateTime.MinValue;
DateTime endDate   = DateTime.MaxValue;


if(!string.IsNullOrEmpty(txtComStartDate.Text))
   startDate = DateTime.ParseExact(txtComStartDate.Text, "dd/MM/yy", provider);

if(!string.IsNullOrEmpty(txtComEndDate.Text))
   endDate = DateTime.ParseExact(txtComEndDate.Text, "dd/MM/yy", provider);


 DateTime itemDate = DateTime.Parse(itemDate);
 if (itemDate >= startDate || itemDate <= endDate || ...)            
 {
 }

似乎更清楚的是,if里面有很多混合选项的巨大声明。

希望这可以帮助。

于 2012-08-20T13:26:09.517 回答
1

你的短路失败了,因为它到达DateTime.Parse(txtComStartDate.Text)并失败了。当其中任何一个未能忽略结果时,您应该让它短路:

DateTime startDate, endDate;
if ((!DateTime.TryParseExact(txtComStartDate.Text, "dd/MM/yy", provider, DateTimeStyles.AssumeLocal, out startDate) 
        || DateTime.Parse(itemDate, provider, DateTimeStyles.AssumeLocal) >= startDate) && 
    (!DateTime.TryParseExact(txtComEndDate.Text, "dd/MM/yy", provider, DateTimeStyles.AssumeLocal, out endDate)
        || DateTime.Parse(itemDate, provider, DateTimeStyles.AssumeLocal) <= endDate))
{
    // Do something here.
}

您将要阅读的方式是“我无法解析开始日期(意味着用户省略了它或它无效)或项目日期大于开始日期;并且结束日期不能被解析(同样,省略或无效)或项目日期小于结束日期。”

利用这里的短路。如果您无法解析开始日期或结束日期,则无需检查该边界的项目日期。但是,由于&&,它会检查两者(除非项目日期在指定的开始日期之前,在这种情况下它可以跳过记录)。

于 2012-08-20T13:48:41.987 回答
0

我可以给你一个关于运营商的简短解释:

if (a && b) 
    //if both a and b are true

if (a || b)
    //if either a or be is true

if (a && (b || c))
    // a must to be true, and either b or c must to be true

记住他们很懒,这意味着:

if (a || b)
    // if a is true, b isn't evaluated

如果您需要更多示例或帮助,请发表评论:)

于 2012-08-20T13:25:27.083 回答
0

根据您的评论,仅填写结束日期会给您带来错误,我建议您可能应该if更多地在您的陈述中加上括号以强制操作顺序。

if (
(txtComStartDate.Text != (String.Empty) && DateTime.Parse(itemDate) >= DateTime.ParseExact(txtComStartDate.Text, "dd/MM/yy", provider))
 ||
(txtComEndDate.Text != (String.Empty) && DateTime.Parse(itemDate) <= DateTime.ParseExact(txtComEndDate.Text, "dd/MM/yy", provider))
 ||
 (DateTime.Parse(itemDate) >= DateTime.ParseExact(txtComStartDate.Text, "dd/MM/yy", provider) && DateTime.Parse(itemDate) <= DateTime.ParseExact(txtComEndDate.Text, "dd/MM/yy", provider))
 )

您可能挂断了DateTime.ParseExact(txtComStartDate.Text, "dd/MM/yy", provider))可能是空的,因为您只是输入了结束日期。

编辑:您的问题是条件短路。如果您同时输入 atxtComStartDate和 a txtComEndDate,则您的条件将无法满足条件(输入的两个值),因为您使用的是OR. 由于同时具有开始和结束将使语句的第一部分为真,它将显示所有超过您的开始日期的节点;不考虑您的结束日期。

您可以在过滤器之前检查这两个值: if(txtComStartDate.Text != (String.Empty)),if(txtComEndDate.Text != (String.Empty))

并在执行此操作后实施过滤 - 确保您获得用户的明确意图。

于 2012-08-20T13:29:42.653 回答
-2

你的说法太复杂了。尝试提取一些条件来分离属性或方法。

于 2012-08-20T13:37:11.137 回答