【问题标题】:Is there a better or more efficient way to filter with linq有没有更好或更有效的方法来过滤 linq
【发布时间】:2011-12-12 01:22:40
【问题描述】:

我有一个包含属性集合的集合。每个属性都有一个类型和一个 ID。我需要在一组属性类型中过滤属性 id 为 or'd 但属性类型为 and'd 的集合。我想出了以下方法,想知道是否有更好的方法。

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

在上面的sn-p中,和AttrGrpIds和orAttributes都是字符串数组。

【问题讨论】:

    标签: c# arrays linq collections filtering


    【解决方案1】:

    我愿意:

    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;
    

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

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

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

    【讨论】:

    • 谢谢你。我已将其与等式的另一部分合并,其中属性类型子值之一是和值。将过去的两步流程简化为我想要做的单个语句。
    • 这里位于filteredModels = from model in allModels let mAttribs = from pa in model.ProductAttributes where orAttributes.Contains(pa.AttributeId) select pa.AttributeType let objAttribIds = model.ProductAttributes.Select(pa => pa.AttributeId) where (string.IsNullOrEmpty(andAttributes[0]) && andAttributes.Count ()==1) || !andAttributes.Except(objAttribIds).Any() where (string.IsNullOrEmpty(andAttrGrpIds[0]) && andAttrGrpIds.Count ()==1) || !andAttrGrpIds.Except(mAttribs).Any() 选择模型;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多