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()); } } }
0 comments:
Post a Comment