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

C# LINQ从比较字符串的列表中获得最佳匹配,c#,linq,C#,Linq,我有一些代码,我试图通过productName在列表中使用inq LINQ查找QProduct。变量ProductName来自文件名,通常在字符串末尾包含一些其他文本。例如,我从文件名获得的productName='0/2'和ProductNameIncomplease是'0/2 new'等 我有以下代码: //Get inaccurate product name from filename productNameInaccurate = fileName.Substring(i

我有一些代码,我试图通过
productName
列表中使用inq LINQ查找
QProduct
。变量
ProductName
来自文件名,通常在字符串末尾包含一些其他文本。例如,我从文件名获得的
productName='0/2'
ProductNameIncomplease
'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();
//从文件名中获取不准确的产品名称
ProductNameIncomplease=fileName.Substring(ind+1,ind2-ind-1)。替换(“-”,“/”;
//获取产品的筛选列表
List filtered=lqp.Where(x=>ProductNameIncomplease.StartsWith(x.Name,StringComparison.InvariantCultureIgnoreCase)).ToList();
//更多筛选-这里我需要通过productName获得最佳匹配
中频(isDop)
qProduct=filtered.Where(x=>x.normy.StartsWith(“ČSN EN”)).FirstOrDefault();
其他的
qProduct=filtered.Where(x=>!x.normy.StartsWith(“ČSN EN”)).FirstOrDefault();
它工作正常,但我还有
productName='32/63'
productName='32/63 BI'
。此代码查找具有
productName=='32/63'
QProduct
,即使
ProductNameIncomplease=='32/63 BI'

我需要的是从
QProduct
列表中找到最佳匹配项,以便对于
ProductNameIncomplease='0/2 new'
我得到
QProduct.Name='0/2'
,对于
ProductNameIncomplease='32/63 Bi'
我得到
QProduct.Name='32/63 B II'
,而不是
QProduct.Name='32/63'
。理想情况下,获取按匹配字符计数排序的过滤列表。

“理想情况下,获取按匹配字符计数排序的过滤列表。”

// 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]);
}
//获取筛选列表并按匹配字符的计数排序
IEnumerable filtered=lqp
.Where(x=>ProductNameIncommission.StartsWith(x.Name,StringComparison.InvariantCultureInogoreCase))
.OrderByDesc(x=>Fitness(x.ProductName,ProductName));
静态整型适应度(字符串个体、字符串目标){
返回可枚举的.Range(0,Math.Min(individual.Length,target.Length))
.Count(i=>个体[i]==目标[i]);
}

我认为这是不可能的。简单的循环就可以了