2017-02-22 4 views
20

私はwinformsアプリケーションで作業しています。 ListViewにフィルタを適用したい。要件は、フォルダ内の指定された名前のファイルを検索するときに、ウィンドウ内の正確な検索機能に実装することでした。"関連性の値"で注文

Windowsでは、見つかったファイルを注文するのにRelevance Valuesが使用されています。

私は多分、winformsがこのアルゴリズムを1つのControlで実装していると考えていましたか?それとも.NETにはどこかの部分がありますか? ない場合、私は手動でろ過オブジェクトを注文するために使用することができ、このアルゴリズムのための任意のC#コードがある:ここ

var searchFor = "search"; 
var newList = oldList.Select(x =>x.Contains(searchFor)) 
        .OrderBy(x => RelevanceValues(x,searchFor)) 
        .ToList(); 
+1

http://stackoverflow.com/questions/19272920/enumerating-files-of-specific-type-in​​-windows –

+0

あなたはフリーテキスト検索ライブラリを必要としています。 NuGetting "Lucene.Net"を試してみてください。ここに少しのサンプルコードがあります:http://codeclimber.net.nz/archive/2009/09/02/lucenenet-your-first-application/ – Enigmativity

+0

問題を解決しましたか? –

答えて

3

は、これを達成するための一例です。この例では、Order by Relevance Values with Fileリストが含まれています。

CODE:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using System.Windows.Forms;  

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     // textBox1 for search string 
     private System.Windows.Forms.TextBox textBox1; 
     // listView1 for show result 
     private System.Windows.Forms.ListView listView1; 
     private System.Windows.Forms.Button button1; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     class MyListViewItem : ListViewItem 
     { 
      public int Index { get; set; } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      List<MyListViewItem> myList = new List<MyListViewItem>(); 

      // open folder browser to get folder path  
      FolderBrowserDialog result = new FolderBrowserDialog(); 
      if (result.ShowDialog() == DialogResult.OK) 
      { 
       // get all file list 
       string[] files = Directory.GetFiles(result.SelectedPath); 
       foreach (string item in files) 
       { 
        // find the relevance value based on search string 
        int count = Regex.Matches(Regex.Escape(item.ToLower()), textBox1.Text.ToLower()).Count; 
        myList.Add(new MyListViewItem() { Text = item, Index = count }); 
       } 
      } 

      List<ListViewItem> list = new List<ListViewItem>(); 
      // add file name in final list with order by relevance value 
      foreach (var item in myList.OrderByDescending(m => m.Index).ToList()) 
      { 
       list.Add(new ListViewItem() { Text = item.Text }); 
      } 

      listView1.Items.AddRange(list.ToArray()); 
     } 
    } 
} 
2

あなたが正規表現でLINQを使用して関連性の値で検索して注文することができます。コードの下に試してみてください:

var searchFor = "search";  
var newList = oldList.Select(l => new 
     { 
      SearchResult = l, 
      RelevanceValue = (Regex.Matches(Regex.Escape(l.Text.ToLower()), searchFor.ToLower()).Count) 
     }) 
      .OrderByDescending(r => r.RelevanceValue) 
      .Select(r => r.SearchResult); 
関連する問題