【问题标题】:Lambda Distinct Select [duplicate]Lambda Distinct Select [重复]
【发布时间】:2015-03-26 06:20:29
【问题描述】:

我有这个 lambda,希望它返回 Distinct 列表。

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

我错过了什么还是应该返回一个不同的列表?

【问题讨论】:

  • 它应该但是根据 bl_SelectBox 的相等比较(如果它是一个自定义引用类型,除了它的属性之外没有其他任何东西......每个引用都不等于其他任何东西)。
  • @AdrianoRepetti 当前资源列表有 text = "Car", value = 1 X 2. 但是它返回它们两次,它应该只返回一次。
  • 您是否希望与每个对象有所不同?喜欢文字还是价值?在您的情况下,它将返回不同的引用。
  • bl_SelectBox 是否覆盖 GetHashCodeEquals?如果没有,尝试实现这个,或者给Distinct一个额外的参数实现IEqualityComparer<bl_SelectBox>
  • 它必须与 value=r.resourceTypeID 不同,但我需要选择 text=r.ResourceTypeName。

标签: c# linq lambda


【解决方案1】:

如果你没有在你的类中重写 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());

【讨论】:

  • 非常感谢。我认为这是最简单的,所以我和这个团队一起去了。
猜你喜欢
  • 2015-12-28
  • 2020-07-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多