1

私は次のようなリストにデータを保存しました

 List<SearchResult> list = new List<SearchResult>();
 SearchResult sr = new SearchResult();
 sr.Description = "sample description";
 list.Add(sr);

私のデータが次のような説明フィールドに保存されているとします。

"JCB Excavator - ECU P/N: 728/35700"
"Geo Prism 1995 - ABS #16213899"
"Geo Prism 1995 - ABS #16213899"
"Geo Prism 1995 - ABS #16213899"
"Wie man BBA reman erreicht"
"this test JCB"
"Ersatz Airbags, Gurtstrammer und Auto Körper Teile"

今、 geojcbのような検索用語でリストをクエリしたい

見てみると、geoという単語が説明フィールドに何度も保存されています。そのため、検索語の単語が最大でデータが最初に来るようにリストを並べ替えたいと思います。私がそうするのを手伝ってください。ありがとう

4

4 に答える 4

2

匿名タイプでstring.Split使用できます。Enumerable.OrderByDescending

List<SearchResult> list = new List<SearchResult>() { 
    new SearchResult(){Description="JCB Excavator - ECU P/N: 728/35700"},
    new SearchResult(){Description="Geo Prism 1995 - ABS #16213899"},
    new SearchResult(){Description="Geo Prism 1995 - ABS #16213899"},
    new SearchResult(){Description="Geo Prism 1995 - ABS #16213899"},
    new SearchResult(){Description="Wie man BBA reman erreicht"},
    new SearchResult(){Description="this test JCB"},
    new SearchResult(){Description="Ersatz Airbags, Gurtstrammer und Auto Körper Teile"},
};

string[] searchTerms = new[]{"geo", "jcb"};
var results = 
    list.Select(sr => new { Searchresult = sr, Words = sr.Description.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) })
        .OrderByDescending(x => x.Words.Count(w => searchTerms.Contains(w.ToLower())))
        .Select(x => x.Searchresult);
于 2012-07-09T09:19:30.980 に答える
1

単純な正規表現を使用できます。パターン内の検索語を次のように組み合わせるだけ|です。

var re = new Regex("geo|JCB",RegexOptions.IgnoreCase);

次に、説明の一致数を数えます。

Console.WriteLine(re.Matches(description).Count); // Outputs '5' in your example

あなたはこれによってあなたのリストを注文することができます:

searchResults.OrderByDescending(r => re.Matches(r).Count);

実例: http: //rextester.com/MMAT58077


編集:コメントにリンクされている新しい質問に従って(そして、うまくいけば、この質問の詳細を更新して重複を終了させます)、最も一般的な結果が結果のリストの早い段階で表示されるように結果を並べ替えます。

これを行うには、最初に各検索フレーズの関連する重みを計算し、これを使用して結果を並べ替えることができます。

ステップ1:データセット全体に各検索語が表示される合計回数をカウントして、均等化を計算します。

var wordsToFind = "Geo JCB".Split();
// find number of times each search phrase is found
var weights = wordsToFind.Select( w => new { 
         Word = w, 
         Weight = list.Where(x => x.Description.Contains(w)).Count() 
    } );

現時点でのこの質問のデータについては、次の結果が得られます。

GEO: 3
JCB: 2

したがって、最初にすべてのGEO結果が必要であり、次にJCBGEO最初の結果が最も頻繁に言及される結果になるのは良いことだと思います。

ステップ2:ステップ1で計算された重みを使用して、検索結果を並べ替えます。

var values = list.Select(x => new { 
      SearchResult = x, 
      Words = x.Description.Split(' ')
   })
   .Select(x => new { 
       SearchResult = x.SearchResult, 
       Weight = weights.Sum(w => x.Words.Contains(w.Word) ? w.Weight : 0)
   })
   .OrderByDescending(x => x.Weight)
   .Select(x => x.SearchResult);

実例: http: //rextester.com/SLH38676

于 2012-07-09T09:16:53.767 に答える
1
List<SearchResult> list = new List<SearchResult>() 
{ 
   new SearchResult { Description = "JCB Excavator - ECU P/N: 728/35700" },
   new SearchResult { Description = "Geo Prism 1995 - ABS #16213899" },
   new SearchResult { Description = "Geo Prism 1995 - ABS #16213899" },
   new SearchResult { Description = "Geo Prism 1995 - ABS #16213899" },
   new SearchResult { Description = "Wie man BBA reman erreicht" },
   new SearchResult { Description = "this test JCB" },
   new SearchResult { Description = "Ersatz Airbags, Gurtstrammer und Auto Körper Teile" }            
   };

   var wordsToFind = "Geo JCB".Split();
   var values = list.Select(x => new { SearchResult = x, Count = x.Description.Split(' ')
                                             .Where(c => wordsToFind .Contains(c)).Count() })
                    .OrderByDescending(x => x.Count)
                    .Select(x => x.SearchResult);
于 2012-07-09T09:17:33.807 に答える
0
var results = db.Blogs.AsEnumerable()
    .Select(sr => new
    {
        Searchresult = sr,
        Words = Regex.Split(sr.Name, @"[^\S\r\n {1,}").Union(Regex.Split(sr.Name2, @"[^\S\r\n]{1,}"))
    })
    .OrderByDescending(x => x.Words.Count(w => {
        foreach (var item in searchTerms)
        {
            if(w.ToLower().Contains(item))
            {
                return true;
            }
        }
        return false;
    }))
    .Select(x => x.Searchresult);
于 2012-09-20T22:40:10.930 に答える