我试图做出这样的情况:用户可以填写“只是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");
}
}
}
}
答案 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))
上,这可能是空的,因为你只是输入结束日期。
编辑:您的问题是条件的短路。如果同时输入txtComStartDate
和txtComEndDate
,则您的条件无法使其符合条件(输入的两个值),因为您正在使用OR
。由于同时具有开始和结束将使语句的第一部分成立,它将显示超过开始日期的所有节点;不考虑你的结束日期。
您可以在过滤器之前检查这两个值:
if(txtComStartDate.Text != (String.Empty))
,if(txtComEndDate.Text != (String.Empty))
并在执行此操作后实施过滤 - 确保您获得用户的确定意图。
答案 4 :(得分:-2)
你的陈述过于复杂。尝试提取一些条件以分离属性或方法。