2

このようにして、データを注文しようとしています

        List<SearchResult> list = new List<SearchResult>() {
        new SearchResult(){ID=1,Title="Geo Prism 1995 GEO GEO- ABS #16213899"},
        new SearchResult(){ID=2,Title="Geo Prism 1995 GEO - ABS #16213899"},
        new SearchResult(){ID=3,Title="Geo Prism 1995 - ABS #16213899"},
        new SearchResult(){ID=3,Title="Geo Prism 1995 - ABS #16213899"},
        new SearchResult(){ID=4,Title="Wie man BBA reman erreicht"},
        new SearchResult(){ID=5,Title="Ersatz Airbags, Gurtstrammer und Auto Körper Teile "},
        new SearchResult(){ID=6,Title="JCB Excavator - ECU P/N: 728/35700"},
        };

        var to_search = new[] { "Geo", "JCB" };
        var result = from searchResult in list
                     let title = searchResult.Title.ToLower()
                     let key_string = to_search.FirstOrDefault(ts => title.Contains(ts))
                     orderby key_string == null ? -1 : title.Split(new[] { key_string }, StringSplitOptions.None).Length descending
                     group searchResult by key_string into Group
                     orderby Group.Count() descending
                     select Group;

        var matched = result.SelectMany(m => m);
        var completeList = matched.Concat(list.Except(matched));
        dataGridView2.DataSource = completeList.ToList();//.SelectMany(x => x).ToList();

データはグリッドに表示されていますが、データが来ないことを期待しています。

出力は今来ています

ID  Title

1   Geo Prism 1995 - ABS #16213899
2   Geo Prism 1995 - ABS #16213899
3   Geo Prism 1995 - ABS #16213899
3   Geo Prism 1995 - ABS #16213899
4   Wie man BBA reman erreicht
5   Ersatz Airbags, Gurtstrammer und Auto Körper Teile 
6   JCB Excavator - ECU P/N: 728/35700

しかし、私はこの下の方法でデータを表示したい

出力は次のようになります

ID  Title

1   Geo Prism 1995 GEO GEO - ABS #16213899
2   Geo Prism 1995 GEO - ABS #16213899
3   Geo Prism 1995 - ABS #16213899
3   Geo Prism 1995 - ABS #16213899
6   JCB Excavator - ECU P/N: 728/35700
4   Wie man BBA reman erreicht
5   Ersatz Airbags, Gurtstrammer und Auto Körper Teile 

"geo jcb"のような検索ワードでデータをソートしているので、JCB はすべて GEO の後に来る必要があります 。ほとんどの行のタイトルに geo が見つかりました。したがって、これらの行が最初に来て、検索語が出現します。geo は私の検索語の 1 つであり、すべての行のタイトルに最大時間を表示します。jcb は私の検索語に含まれているため、次の jcb が来るはずですが、最後に jcb 関連の行が出力されます。私のlinqクエリを変更する方法を教えてください。ありがとう

4

2 に答える 2

1
class SearchResult{
    public int ID { get; set; } 
    public string Title{ get; set; }
}

void Main()
{

    List<SearchResult> list = new List<SearchResult>() {
        new SearchResult(){ID=4,Title="Wie man BBA reman erreicht"},
        new SearchResult(){ID=5,Title="Ersatz Airbags, Gurtstrammer und Auto Körper Teile "},
        new SearchResult(){ID=6,Title="JCB Excavator - ECU P/N: 728/35700"},
        new SearchResult(){ID=2,Title="Geo Prism 1995 GEO - ABS #16213899"},
        new SearchResult(){ID=3,Title="Geo Prism 1995 - ABS #16213899"},
        new SearchResult(){ID=1,Title="Geo Prism 1995 GEO GEO- ABS #16213899"},
    };

    var to_search = new[] { "Geo", "JCB" };

    var result = from sr in list
                 let w = to_search.FirstOrDefault(ts => sr.Title.ToLower().Contains(ts.ToLower()))
                 where w != null
                 let a = new {sr=sr, word=w.ToLower()}
                 group a by a.word into g
                 orderby g.Count() descending
                 let sorted = g.OrderByDescending(a=> a.sr.Title.Select((c, i) => a.sr.Title.Substring(i)).Count(sub => sub.ToLower().StartsWith(a.word)))
                 from a in sorted 
                 select a.sr;

    var completeList = result.Concat(list.Except(result));

    foreach (var element in completeList)
        Debug.WriteLine(String.Format("ID={0},Title={1}", element.ID, element.Title));
}

出力:

ID=1,Title=Geo Prism 1995 GEO GEO- ABS #16213899
ID=2,Title=Geo Prism 1995 GEO - ABS #16213899
ID=3,Title=Geo Prism 1995 - ABS #16213899
ID=6,Title=JCB Excavator - ECU P/N: 728/35700
ID=4,Title=Wie man BBA reman erreicht
ID=5,Title=Ersatz Airbags, Gurtstrammer und Auto Körper Teile 
于 2012-07-10T14:47:24.133 に答える
0
    var result = (from searchResult in list
                 let title = searchResult.Title.ToLower()
                 let key_string = to_search.FirstOrDefault(ts => title.Contains(ts))
                 orderby key_string == null ? -1 : title.Split(new[] { key_string }, StringSplitOptions.None).Length descending
                 group searchResult by key_string into Group
                 select Group).OrderByDescending(grp => grp.Count()).ThenByDescending( grp => CountStringOccurrances(grp.Key, to_search));

public static int CountStringOccurrences(string text, string[] pattern)
{
    // Loop through all instances of the string 'text'.
    int count = 0;
    foreach (string itm in pattern)
    { 
       int i = 0;
       while ((i = text.IndexOf(itm, i)) != -1)
       {
          i += itm.Length;
          count++;
        }
    }
    return count;
}
于 2012-07-10T14:24:15.487 に答える