[英]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.