使用If Statement,&&amp ;;过滤搜索条件。和||

时间:2012-08-20 13:19:56

标签: c# winforms

我试图做出这样的情况:用户可以填写“只是txtComStartDate”或“只是txtComEndDate”或“txtComStartDate& txtComEndDate”。

如果用户在2012年8月18日填写txtComStartDate,则只会显示从18/08/12开始的数据。

如果用户在2012年8月19日填写txtComEndDate,则只显示19/08/12之后的数据。

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

if语句给出了错误并且无法正常工作。我对&&||感到困惑。有人可以帮忙吗?非常感谢您的帮助。谢谢。

我的代码:

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");
            }
        }
    }
}

5 个答案:

答案 0 :(得分: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语句。

希望这有帮助。

答案 1 :(得分: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.
}

您要阅读此内容的方式是“我无法解析开始日期(意味着用户省略了它或无效)或项目日期大于开始日期;以及结束日期无法解析(再次,省略或无效)或项目日期小于结束日期。“

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

答案 2 :(得分: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

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

答案 3 :(得分: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))上,这可能是空的,因为你只是输入结束日期。

编辑:您的问题是条件的短路。如果同时输入txtComStartDatetxtComEndDate,则您的条件无法使其符合条件(输入的两个值),因为您正在使用OR。由于同时具有开始和结束将使语句的第一部分成立,它将显示超过开始日期的所有节点;不考虑你的结束日期。

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

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

答案 4 :(得分:-2)

你的陈述过于复杂。尝试提取一些条件以分离属性或方法。