Friday, March 3, 2017

Order by “Relevance Values”

Leave a Comment

I'm working on winforms application. I want to apply a filter on ListView. The requirement was to implement to exact search feature in windows when searching files with a given name in a folder.

It turns out that Windows is using Relevance Values to order found files.

I was thinking, maybe winforms implemented this algorithm in one Control or another? Or maybe .NET has it some where? If not, is there any C# code for this algorithm that I can use to manually order filtered objects:

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

1 Answers

Answers 1

Here is an example to achieve this. This example contain Order By Relevance Values with File list.

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());         }     } } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment