Lambda Distinct Select
我有这个lambda,希望它返回不同的列表。
1
| var ResourceTypeNameList = Resources .Select(r => new bl_SelectBox { text =r .ResourceTypeName, value=r .resourceTypeID }).Distinct(); |
我是缺少什么,还是应该返回一个不同的列表?
- 它应该但是根据bl_selectbox的相等比较(如果它是一个没有任何属性的自定义引用类型…每个引用都不等于任何其他引用)。
- @adrianepetti当前资源列表中有text="car",值=1 x 2。但是它返回两次,并且只返回一次。
- 您是否希望与每个对象都有所区别?像文本还是值?在您的情况下,它将返回不同的引用。
- bl_SelectBox是否覆盖GetHashCode和Equals?如果没有,尝试实现它,或者给Distinct实现IEqualityComparer提供一个附加参数。
- 作为对Caramiriel评论的补充——如果不是,Distinct可能不会过滤任何内容,因为输入是一系列不同的对象。
- 它必须在value=r.resourcetypeid上不同,但我需要选择text=r.resourcetypename。
- @rudolphopperman本身distinct()不知道如何检测平等。这就是您的对象必须重写GetHashCode和Equals的原因,或者您必须指定一个自定义的IEualityComparer作为参数。
如果不重写类中的Equals和GetHashCode,或者不提供自定义的相等比较器,Distinct方法将使用默认的相等比较器作为类型,并通过引用比较引用类型。不是由属性值决定的。如果不希望此行为覆盖类中的相关方法,或者如果无法更改类,请为该类型实现一个IEqualityComparer,并将其传递给Distinct:
1 2 3
| var ResourceTypeNameList = Resources
.Select(r => new bl_SelectBox { text =r .ResourceTypeName, value=r .resourceTypeID })
.Distinct(new MyEqualityComparer ()); |
另一个快速解决方案是使用GroupBy:
1 2 3 4
| var ResourceTypeNameList = Resources
.Select(r => new bl_SelectBox { text =r .ResourceTypeName, value=r .resourceTypeID })
.GroupBy(x => x .SomeProperty)
.Select(x => x .First()); |
- 非常感谢你。我和这群人一起去,因为从那时起这是最简单的。