2017-02-22 71 views
20

Pracuję nad aplikacją WinForm. Chcę zastosować filtr na ListView. Warunkiem było zastosowanie funkcji wyszukiwania ścisłego w oknach podczas wyszukiwania plików o danej nazwie w folderze.Sortuj według "Relewance Values"

Okazuje się, że system Windows używa Relevance Values do zamawiania znalezionych plików.

Myślałem, może WinFormy wdrożyły ten algorytm w jednej Kontroli lub innej? A może .NET ma to gdzie? Jeśli nie, to istnieje C# tego algorytmu można wykorzystać ręcznie zamówienie filtrowane obiekty:

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

Trzeba bezpłatną bibliotekę wyszukiwania tekstu. Spróbuj NuGetting "Lucene.Net". Oto mały przykładowy kod: http://codeclimber.net.nz/archive/2009/09/02/lucenenet-your-first-application/ – Enigmativity

+0

Rozwiązałeś już swój problem? –

Odpowiedz

3

Oto przykład dla osiągnięcia tego celu. Ten przykład zawiera wartości uporządkowania według wartości z listą plików.

KOD:

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

Możesz wyszukać i zamówić przez wartości trafności przy użyciu LINQ z Regex. Spróbuj poniżej kodu:

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);