LINQ从比较字符串的列表中获得最佳匹配

本文关键字:最佳 列表 比较 字符串 LINQ | 更新日期: 2023-09-27 18:18:36

我有代码,我试图找到QProductproductNameList<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'。这段代码发现QProductproductName == '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列表进行排序。

LINQ从比较字符串的列表中获得最佳匹配

"理想情况下,按匹配字符的计数对过滤列表进行排序。"

// 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]);
}