【问题标题】:Intersect many list by one property一个属性与多个列表相交
【发布时间】:2019-01-09 12:28:49
【问题描述】:

我有List<List<ProductFilter>>

public class ProductFilter
{
    public int Id { get; set; }
    public int FilterValueId { get; set; }
    public int ProductId { get; set; }
    public int? FilterId { get; set; }
    public string FilterValue { get; set; }
    public string FilterName { get; set; }
}

我想要Intersect by ProductId 并返回 ProductFilter。有可能吗? 我试试看:

var intersection = groupList
  .Aggregate((previousList, nextList) => previousList
     .Select(x => x.ProductId)
     .Intersect(nextList.Select(x => x.ProductId))
  .ToList());

但它给了我错误,因为返回 int:

无法隐式转换类型“System.Collections.Generic.List<int>” 到'System.Collections.Generic.List<ProductFilter>'

【问题讨论】:

    标签: c# sql .net linq intersect


    【解决方案1】:

    您收到上述错误是因为对于 Aggregate 的特定重载,例如 List<ProductFilter> 而不是 @987654324,累加器函数预计会返回 与源中元素相同的类型 @。

    要生成IEnumerable<int> 作为结果,首先项目到IEnumerable<int>,然后调用Aggregate

    groupList.Select(p => p.Select(e => e.ProductId))
             .Aggregate((previousList, nextList) => previousList.Intersect(nextList));
    

    【讨论】:

      【解决方案2】:

      为此,您必须使用Intersect 的重载,它接受IEqualityComparer<>

      class ProductFilterProductIdEqualityComparer : IEqualityComparer<ProductFilter>
      {
          public bool Equals(ProductFilter x, ProductFilter y)
          {
              if (ReferenceEquals(x, y))
                  return true;
              if (ReferenceEquals(x, null))
                  return false;
              if (ReferenceEquals(y, null))
                  return false;
              return x.ProductId == y.ProductId;
          }
      
          public int GetHashCode(ProductFilter obj) => obj.ProductId;
      }
      
      var productFilterProductIdEqualityComparer = new ProductFilterProductIdEqualityComparer();
      var intersection = groupList
          .Aggregate((previousList, nextList) => 
              previousList.Intersect(nextList, productFilterProductIdEqualityComparer)
          .ToList());
      

      注意:请记住,当两个ProductFilter 具有相同的ProductId 但在其他属性上不同时,您只会在intersection 中获得第一个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        相关资源
        最近更新 更多