0

私のアプリケーションでは、asp.net、c#、jqueryを使用しており、次のような要件があります。

次のような内容のxmlファイル「Mobile.xml」があります。

<Mobiles>
  <Mobile Id="1">
    <MDetails ModelNo="1" Desc="x phone color red"/>
    <MDetails ModelNo="2" Desc="x phone color green"/>
    <MDetails ModelNo="3" Desc="x phone color blue"/>
    <MDetails ModelNo="4" Desc="x phone color black"/>
    <MDetails ModelNo="5" Desc="x phone color yellow"/>
    <MDetails ModelNo="6" Desc="x phone color pink"/>
    <MDetails ModelNo="7" Desc="x phone color gray"/>
    <MDetails ModelNo="8" Desc="x phone color silver"/>
    <MDetails ModelNo="9" Desc="x phone color orange"/>
  </Mobile>
  <Mobile Id="2">
    <MDetails ModelNo="11" Desc="y phone color red"/>
    <MDetails ModelNo="12" Desc="y phone color green"/>
    <MDetails ModelNo="13" Desc="y phone color blue"/>
    <MDetails ModelNo="14" Desc="y phone color black"/>
    <MDetails ModelNo="15" Desc="y phone color yellow"/>
    <MDetails ModelNo="16" Desc="y phone color pink"/>
    <MDetails ModelNo="17" Desc="y phone color gray"/>
    <MDetails ModelNo="18" Desc="y phone color silver"/>
    <MDetails ModelNo="19" Desc="y phone color orange"/>
  </Mobile>
  <Mobile Id="3">
  ......
  <Mobile>
  ......
</Mobiles>

そして、入力された検索文字列からキーワードが取得される複数のキーワードに関して、すべてのタグの詳細を取得したいと考えています。

検索文字列が「x phone color red green」の場合のように、タグの詳細を返す必要があります。

<MDetails ModelNo="1" Desc="x phone color red"/>
<MDetails ModelNo="2" Desc="x phone color green"/>

検索文字列が"phone color red green"の場合、次のように返されます。

<MDetails ModelNo="1" Desc="x phone color red"/>
<MDetails ModelNo="2" Desc="x phone color green"/>
<MDetails ModelNo="11" Desc="y phone color red"/>
<MDetails ModelNo="12" Desc="y phone color green"/>

十分ではない以下のコードを試しました:

public void doSearch(string strSearchContent)
{
    string[] strArrSearchContents;
    strArrSearchContents = strSearchContent.Split(' ');

    string fileName = HttpContext.Current.Server.MapPath(@"~\XMLFiles/Mobile.xml");
    XDocument doc = null;
        if (System.IO.File.Exists(fileName))
        {
            doc = XDocument.Load(fileName);

            IEnumerable<XElement> list1 =
                from elements in doc.Descendants("MDetails")
                where
                    elements.Attribute("Desc").Value.Trim().ToLower().Contains(strArrSearchContents[0]) &&
                    elements.Attribute("Desc").Value.Trim().ToLower().Contains(strArrSearchContents[1]) &&
                    elements.Attribute("Desc").Value.Trim().ToLower().Contains(strArrSearchContents[2]) &&
                    elements.Attribute("Desc").Value.Trim().ToLower().Contains(strArrSearchContents[3]) &&
                    elements.Attribute("Desc").Value.Trim().ToLower().Contains(strArrSearchContents[4])
                select elements;

        }
}

上記のコードは、このタイプの検索の解決策ではありません...しかし、私の要件を説明しました。

4

1 に答える 1

0

もう少し一般的なものを書きましたが、使用できると思います。基本的に、これは次のような linq クエリです。説明内の各単語について、検索対象のリストに含まれていることを確認してください。

string toFind = "x phone color red green";
string[] toFindStuff = toFind.Split(' ');
List<string> desc = new List<string>{ "x phone color red", "y phone color green", "x phone color blue", "x phone color green"};
List<string> filtered = desc.Where(x => x.Split(' ').All(y => toFindStuff.Contains(y))).ToList();

結果:

List<String> (2 items) 
x phone color red 
x phone color green 
于 2013-01-08T15:03:12.693 に答える