簡體   English   中英

C# 高級搜索列表

[英]C# advanced search in list

我有包含兩項的字符串的內存列表:“product 1 max”和“product 1 min”。 當用戶輸入為“產品分鍾”時,我如何搜索並獲取“產品 1 分鍾”?

請注意,中間有一些缺失的單詞。

var list = new List<string> {"product 1 max", "product 1 min" };
//user input 'product min' and he expected 'product 1 min'

一種方法是拆分輸入並將其與字符串列表中的每個單詞進行匹配。

var list = new List<string> { "product 1 max", "product 1 min" };
var input = "product min";
List<string> inputParts = input.Split(' ').ToList();

// contains all the input strings
List<string> results = list.Where(x => x.Split(' ').Intersect(inputParts).Count() == inputParts.Count).ToList();

// partial matching strings
List<string> partialMatches = list.Where(x => x.Split(' ').Intersect(inputParts).Count() > 0).ToList();

可以在此處找到有關 Intersect 方法的文檔

如果將輸入拆分為單詞,則可以將list過濾為包含所有輸入單詞的匹配項:

var inputWords = input.Split(' ');
var ans = list.Where(s => inputWords.All(s.Contains)).ToList();

注意: s.Contains是一種更短、更有效(更晦澀)的方式w => s.Contains(w)

一種實現方法是使用 Damerau-Levenshtein 算法。 這是一種基本上計算一個字符串需要多少更改的算法等於另一個,它可以手動實現,但有點棘手,並且已經有一個庫( SoftWx.Match )為您封裝邏輯。

SoftWx.Match 有一個名為DamerauOSA(string value1, string value2)的 static 方法,該方法返回一個介於 0 和 1 之間的double精度值,說明兩個字符串的相似程度,將其與 LINQ 混合使用即可。

List<string> products = new List<string>()
{
    "product 1 max",
    "product 1 min"
};
var stringToCompare = "product min";

products.ForEach(x => Console.WriteLine($"Item {x} against {stringToCompare} has {Similarity.DamerauOSA(x, stringToCompare)} points of similarity"));

// 0.80 is an arbitrary number of how much "equality" you want from both strings
var filtered = products.Where(x => Similarity.DamerauOSA(x, stringToCompare) > 0.80).ToList();

Console.WriteLine("Filtered");
filtered.ForEach(x => Console.WriteLine(x));

這里的工作示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM