c# winforms

c# - Ordenar por "Valores de relevancia"



winforms (2)

Estoy trabajando en la aplicación winforms. Quiero aplicar un filtro en ListView. El requisito era implementar la función de búsqueda exacta en Windows al buscar archivos con un nombre de pila en una carpeta.

Resulta que Windows está utilizando los valores de relevancia para ordenar los archivos encontrados.

Estaba pensando, ¿tal vez winforms implementó este algoritmo en un Control u otro? O tal vez .NET lo tiene en algún lugar? Si no, ¿hay algún código de C # para este algoritmo que pueda usar para ordenar objetos filtrados manualmente?

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


Aquí hay un ejemplo para lograr esto. Este ejemplo contiene Order By Relevance Values ​​with File list.

CÓDIGO:

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


Puede buscar y ordenar por valores de relevancia usando LINQ con Regex. Por favor, intente el siguiente código:

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