是否可以从类列表中创建最合适的Linq查询?

时间:2016-02-25 15:14:18

标签: c# linq

您好我有一个函数可以从集合中返回一个类的最佳拟合。我知道如何使用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;
    }

1 个答案:

答案 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;
    }