您好我有一个函数可以从集合中返回一个类的最佳拟合。我知道如何使用linq查询替换foreach语句以获取新列表,但我想知道是否可以使用linq语句返回单个结果,该语句等同于下面代码的最佳拟合。
private ProductDefaults GetBestFitProductDefault(Product product,IList<ProductDefaults> defaultList, ProductDefaultsTypeEnum type)
{
ProductDefaults pdef = null;
var matches = -1;
var bestfit = matches;
foreach (var def in defaultList)
{
if(def.DefaultType == type)
{
matches = 0;
if (def.Level1Ref == product.Level1Ref)
{
matches++;
}
if (def.Level2Ref == product.Level2Ref)
{
matches++;
}
if (def.Level3Ref == product.Level3Ref)
{
matches++;
}
if (def.Level4Ref == product.Level4Ref)
{
matches++;
}
if (def.Level5Ref == product.Level5Ref)
{
matches++;
}
if (def.Level6Ref == product.Level6Ref)
{
matches++;
}
if(matches > bestfit)
{
bestfit = matches;
pdef = def;
}
}
}
return pdef;
}
答案 0 :(得分:0)
经过一些研究后,我想出了这个Linq查询来替换代码,希望这将有助于其他可能需要类似解决方案的人。 let允许我创建一个新列,用于计算最佳匹配或匹配数。通过对最佳拟合下降的结果进行排序,我确信第一个对象将具有最高的最佳拟合值,因此我需要的那个。在这种情况下,可能会有多个具有相同最佳匹配分数的产品随机选择一个,但在我的情况下,这是可以接受的。
private ProductDefaults GetBestFitProductDefault(Product product, IList<ProductDefaults> defaultList, ProductDefaultsTypeEnum type)
{
ProductDefaults pdef = null;
var list =
from pd in defaultList
let bestfit = pd.Level1Ref == product.Level1Ref ? 1 : 0 +
pd.Level2Ref == product.Level2Ref ? 1 : 0 +
pd.Level3Ref == product.Level3Ref ? 1 : 0 +
pd.Level4Ref == product.Level4Ref ? 1 : 0 +
pd.Level5Ref == product.Level5Ref ? 1 : 0 +
pd.Level6Ref == product.Level6Ref ? 1 : 0
where pd.DefaultType == type
orderby bestfit descending
group pd by bestfit into pdl
select new { pdl.Key, best = pdl.ToList() };
pdef = list.First().best.FirstOrDefault();
return pdef;
}