Lambda Distinct Select

4

我有这个lambda表达式,想让它返回一个不重复的列表。

var ResourceTypeNameList = Resources.Select(r => new bl_SelectBox{ text=r.ResourceTypeName, value=r.resourceTypeID }).Distinct();

我有点不确定,但是这个应该返回一个不同的列表吧?

根据bl_SelectBox的相等比较(如果它是一个自定义引用类型,除了其属性之外没有其他内容...每个引用都不等于任何其他东西),应该这样做。 - Adriano Repetti
你是否想要每个对象中的某些内容是不同的?比如文本或值?在你的情况下,它将返回不同的引用。 - Ramie
bl_SelectBox 是否覆盖了 GetHashCodeEquals 方法?如果没有,尝试实现它们,或者给 Distinct 方法添加一个实现 IEqualityComparer<bl_SelectBox> 接口的额外参数。 - Caramiriel
1
它必须基于value=r.resourceTypeID进行区分,但我需要选择text=r.ResourceTypeName。 - Rudolph Opperman
@RudolphOpperman 本身 Distinct() 不知道如何检测相等性。这就是为什么您的对象必须重写 GetHashCode 和 Equals 或者指定一个自定义的 IEualityComparer 作为参数的原因。 - Adriano Repetti
显示剩余2条评论
1个回答

14
如果您的类中没有覆盖EqualsGetHashCode方法或提供自定义相等比较器,则Distinct方法将使用默认的相等比较器来比较类型。它通过引用而不是属性值来比较引用类型。如果您不想要这种行为,可以在您的类中覆盖相关方法,或者如果您无法更改该类,则为该类型实现IEqualityComparer并将其传递给Distinct方法。
var ResourceTypeNameList = Resources
   .Select(r => new bl_SelectBox{ text=r.ResourceTypeName, value=r.resourceTypeID })
   .Distinct(new MyEqualityComparer());

另一个快速的解决方案是使用 GroupBy

var ResourceTypeNameList = Resources
  .Select(r => new bl_SelectBox{ text=r.ResourceTypeName, value=r.resourceTypeID })
  .GroupBy(x => x.SomeProperty)
  .Select(x => x.First());

非常感谢。我选择跟随这个团队,因为这是最简单的方式。 - Rudolph Opperman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接