0

この行では、以下の関数が正しく機能していません

if (itemDescription.ToLower().Contains(txtComKeyword1.Text.ToLower()) ||
    itemDescription.ToLower().Contains(txtComKeyword2.Text.ToLower()) ||
    itemDescription.ToLower().Contains(txtComKeyword3.Text.ToLower()) ||
    itemDescription.ToLower().Contains(txtComKeyword4.Text.ToLower()))

1つ以上txtComKeywordが空の場合。txtComKeyword4つすべてがいっぱいになった場合にのみ正しく機能します。

キーワードを使用してXMLファイルのデータを制限することにより、データをフィルタリングしたいと思います。結果として、検出されているキーワードが<item></item>表示されます。1、2、3、4個のキーワードを入力するかどうかをユーザーが選択できるようにしたい。残念ながら、空の場合は常にtxtComKeywords、XMLファイル全体<item></item>が出力されます。

私はプログラミングにとても慣れていません。可能であれば助けていただけませんか?ありがとうございました。

私のコード:

private void searchComByKeywords()
{
    // Process the list of files found in the directory. 
    string[] fileEntries = Directory.GetFiles(sourceDir);
    foreach (string fileName in fileEntries)
    {
        try
        {
            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 itemDescription = itemElement.GetElementsByTagName("description")[0].InnerText;

                if (itemDescription.ToLower().Contains(txtComKeyword1.Text.ToLower()) || itemDescription.ToLower().Contains(txtComKeyword2.Text.ToLower()) || itemDescription.ToLower().Contains(txtComKeyword3.Text.ToLower()) || itemDescription.ToLower().Contains(txtComKeyword4.Text.ToLower()))
                {
                    string itemTitle = itemElement.GetElementsByTagName("title")[0].InnerText;
                    string itemDate = itemElement.GetElementsByTagName("pubDate")[0].InnerText;
                    string itemAuthor = itemElement.GetElementsByTagName("author")[0].InnerText;

                    richComResults.AppendText("Author: " + itemAuthor + "\nDate: " + itemDate + "\nTitle: " + itemTitle + "\nDescription: " + itemDescription + "\n\n--------\n\n");
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

編集:

private void searchComByKeywords()
{
    // Process the list of files found in the directory. 
    string[] fileEntries = Directory.GetFiles(sourceDir);
    foreach (string fileName in fileEntries)
    {
        try
        {
            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 itemDescription = itemElement.GetElementsByTagName("description")[0].InnerText;
                string[] words = new String[] { null, null, null, null };
                string key1 = txtComKeyword1.Text.Trim();
                string key2 = txtComKeyword2.Text.Trim();
                string key3 = txtComKeyword3.Text.Trim();
                string key4 = txtComKeyword4.Text.Trim();
                words[0] = (key1.Length == 0 ? null : key1.ToLower());
                words[1] = (key2.Length == 0 ? null : key2.ToLower());
                words[2] = (key3.Length == 0 ? null : key3.ToLower());
                words[3] = (key4.Length == 0 ? null : key4.ToLower());

                if (words.Contains(itemDescription.ToLower())) 
                {
                    string itemTitle = itemElement.GetElementsByTagName("title")[0].InnerText;
                    string itemDate = itemElement.GetElementsByTagName("pubDate")[0].InnerText;
                    string itemAuthor = itemElement.GetElementsByTagName("author")[0].InnerText;

                    richComResults.AppendText("Author: " + itemAuthor + "\nDate: " + itemDate + "\nTitle: " + itemTitle + "\nDescription: " + itemDescription + "\n\n--------\n\n");
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}
4

1 に答える 1

1

ループに入る前にすべての単語を読み取り、文字列配列に保存します 配列
に単語を入力する前に、テキスト ボックスが空かどうかを確認します
次に、Array.Containsメソッドを使用して、itemDescription が単語の配列にあるかどうかを確認します

string[] words = new String[] {null, null, null, null};
// as from John Saunders comment below, 
// pass everything into a local temp variable to avoid double 
// evaluation (and string rebuild) of the Trim() method
string key1 = txtComKeyword1.Text.Trim();
string key2 = txtComKeyword2.Text.Trim();
string key3 = txtComKeyword3.Text.Trim();
string key4 = txtComKeyword4.Text.Trim();
words[0] = (key1.Length == 0 ? null : key1.ToLower());
words[1] = (key2.Length == 0 ? null : key2.ToLower());
words[2] = (key3.Length == 0 ? null : key3.ToLower());
words[3] = (key4.Length == 0 ? null : key4.ToLower());

if (words.Contains(itemDescription.ToLower())) 
    .....

利点は 2 つあります。

  • textBox を読み取り、ループ外で 1 回だけ小文字に変換します
  • if ステートメントは非常に単純化されています

C#の三項演算子は、共通のコーディング パターンを表現する簡単な方法です。

if(condition == true)
   variable = first statement;
else
   variable = second statement;

そのコードは三項演算子になります

   variable = (condition == true ? first statement : second statement);
于 2012-08-08T22:40:57.247 に答える