LINQ从比较字符串的列表中获得最佳匹配
本文关键字:最佳 列表 比较 字符串 LINQ | 更新日期: 2023-09-27 18:18:36
我有代码,我试图找到QProduct
由productName
在List<QProduct>
(lqp)使用LINQ LINQ。我从文件名中获得的变量productNameInaccurate
通常包含一些其他文本,通常在字符串的末尾。例如,我从fileName中得到的productName = '0/2'
和productNameInaccurate
是'0/2 new'
等。
我有这样的代码:
//Get inaccurate product name from filename
productNameInaccurate = fileName.Substring(ind + 1, ind2 - ind - 1).Replace("-", "/");
//Get filtered list of products
List<QProduct> filtered = lqp.Where(x=>productNameInaccurate.StartsWith(x.Name, StringComparison.InvariantCultureIgnoreCase)).ToList();
//Some more filtering - here I need to get best match by productName
if (isDop)
qProduct = filtered.Where(x => x.normy.StartsWith("ČSN EN")).FirstOrDefault();
else
qProduct = filtered.Where(x => !x.normy.StartsWith("ČSN EN")).FirstOrDefault();
它工作正常,但我也有productName = '32/63'
和productName = '32/63 B I'
。这段代码发现QProduct
有productName == '32/63'
,即使productNameInaccurate == '32/63 BI'
。
我需要的是从QProduct
列表中找到最佳匹配,因此对于productNameInaccurate='0/2 new'
,我得到QProduct.Name = '0/2'
,对于productNameInaccurate='32/63 Bi'
,我得到QProduct.Name = '32/63 B II'
而不是QProduct.Name = '32/63'
。理想情况下,按匹配字符的计数对filtered
列表进行排序。
"理想情况下,按匹配字符的计数对过滤列表进行排序。"
// Get the filtered list and sort by count of matching characters
IEnumerable<QProduct> filtered = lqp
.Where(x=>productNameInaccurate.StartsWith(x.Name, StringComparison.InvariantCultureIgnoreCase))
.OrderByDesc(x => Fitness(x.ProductName, productNameInaccurate));
static int Fitness(string individual, string target) {
return Enumerable.Range(0, Math.Min(individual.Length, target.Length))
.Count(i => individual[i] == target[i]);
}