0

私はこのような状況を作ろうとしています: ユーザーは、「txtComStartDate のみ」または「txtComEndDate のみ」または「txtComStartDate と txtComEndDate の両方」のいずれかを入力できます。

ユーザーtxtComStartDateが 18/08/12 と入力すると、18/08/12 以降のデータのみが表示されます。

ユーザーtxtComEndDateが 19/08/12 と入力すると、19/08/12 以降のデータのみが表示されます。

ユーザーがtxtComStartDate18/08/12 とtxtComEndDate19/08/12 の両方を制限すると、これら 2 つの日付の間のデータが表示されます。

ステートメントでエラーが発生し、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");
            }
        }
    }
}
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))終了日を入力しただけなので、おそらく空の電話を切ったのでしょう。

編集:あなたの問題は、条件の短絡です。txtComStartDateaと a の両方を入力するとtxtComEndDateOR. 開始と終了の両方があるとステートメントの最初の部分が true になるため、開始日を過ぎたすべてのノードが表示されます。終了日に関係なく。

フィルタの前に両方の値をチェックできます: if(txtComStartDate.Text != (String.Empty)),if(txtComEndDate.Text != (String.Empty))

これを行った後にフィルタリングを実装します。これにより、ユーザーの意図を確実に得ることができます。

于 2012-08-20T13:29:42.653 に答える
-2

ステートメントが複雑すぎます。プロパティまたはメソッドを分離するために、いくつかの条件を抽出してみてください。

于 2012-08-20T13:37:11.137 に答える