代码之家  ›  专栏  ›  技术社区  ›  Sonic Soul

Linq查询问题:基于对象属性的Distinct

  •  1
  • Sonic Soul  · 技术社区  · 14 年前

    我正在将多个列表聚合到一个列表中,并希望根据Foo的一个属性使其与众不同(食物道具1).. 我没有权限修改Foo的相等比较器。

    Dictionary<string, List<Foo>> fooDictionary = new Dictionary<string, List<Foo>>();
    List<Foo> foovals = (from e in fooDictionary
                         where e.Key == "foo1" || e.Key == "foo2" || e.Key == "foo3"
                         select e.Value).SelectMany(f => f).ToList();
    

    这里唯一缺少的是结尾处的.Distinct(),以使Foo是唯一的,但是,在我的例子中,我不能修改关于Foo的任何内容,所以仅仅调用Distinct()是行不通的。

    是否有方法修改此查询以根据食物道具1?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    你可以用 DistinctBy 方法 MoreLINQ :

    var query = fooVals.DistinctBy(foo => foo.Property1);
    
        2
  •  3
  •   codekaizen    14 年前

    可以将自定义相等比较器传递给 Distinct() :

    .SelectMany().Distinct(new FooEqualityComparer());
    

    在新文件中食品均衡器comparer.cs":

    public class FooEqualityComparer : IEqualityComparer<Foo>
    {
        public bool Equals(Foo x, Foo y)
        {
            return Equals(x.Prop1, y.Prop1);
        }
    
        public int GetHashCode(Foo x)
        {
            return x.Prop1.GetHashCode();
        }
    }
    
        3
  •  0
  •   LukeH    14 年前
    var tempKeys = new HashSet<int>();    // change int to the actual type of Prop1
    
    List<Foo> foovals = (from e in fooDictionary
                         where e.Key == "foo1" || e.Key == "foo2" || e.Key == "foo3"
                         select e.Value).SelectMany(f => f)
                                        .Where(f => tempKeys.Add(f.Prop1))
                                        .ToList();