是否有更好或更有效的方法来过滤linq

时间:2011-12-11 16:54:50

标签: c# arrays linq collections filtering

我有一个包含属性集合的集合。每个属性都有一个类型和一个Id。我需要过滤属性ID在一组属性类型中所属的集合,但属性类型是和。我想出了以下内容并想知道是否有更好的方法。

foreach (var ag in andAttrGrpIds)
{
  filteredModels = filteredModels.Where(x => x.ProductAttributes.Any(pa => pa.AttributeType==ag && orAttributes.Contains(pa.AttributeId))).ToList();            
}

在上面的代码片段中,andAtrtrGrpIds和orAttributes是字符串数组。

1 个答案:

答案 0 :(得分:2)

我愿意:

var filteredModels = from model in originalModels

                     let mAttribs = from pa in model.ProductAttributes
                                    where orAttributes.Contains(pa.AttributeId)
                                    select pa.AttributeType

                     where !andAttrGrpIds.Except(mAttribs).Any()

                     select model;

现在它更具可读性,并且(可能)具有更好的性能配置文件。

我们的想法是从每个模型中获取所有“合格”产品属性类型的集合,然后测试 all andAttrGrpIds是否存在于此集合中。

顺便说一句,您的命名约定似乎很奇怪:andAttrGrpIds集合似乎实际上代表了属性类型的集合。