【问题标题】:Order by "Relevance Values"按“相关值”排序
【发布时间】:2020-12-16 04:30:41
【问题描述】:

我正在开发 Windows 窗体应用程序。我想在 ListView 上应用过滤器。要求是在文件夹中搜索具有给定名称的文件时在 windows 中实现搜索功能。

事实证明,Windows 正在使用Relevance Values 来订购找到的文件。

我在想,也许.Net 中有一个内置的解决方案? 如果没有,是否有任何用于该算法的 C# 代码可用于手动排序过滤对象:

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

【问题讨论】:

标签: c# winforms


【解决方案1】:

这是实现此目的的示例。此示例包含带有文件列表的按相关性值排序。

代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2021-11-10
      相关资源
      最近更新 更多