- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个名为 Page 的对象和一个名为 p 的实例,该实例具有一个名为 AssociatedAttributes 的自定义属性。如果我执行以下操作:
int numMatchingAttributes = p.AssociatedAttributes.Intersect( p.AssociatedAttributes ).Distinct( ).Count( );
numMatchingAttributes 最终等于 0,即使 p 有 6 个 AssociatedAttributes。为什么不等于 6?
AssociatedAttributes
类型为 List<Attribute>
( Attribute
是我自己的类(class),不是 System.Attribute
)和 Attribute
工具 IComparable<Attribute>
,我没有实现 IEquatable
,我应该吗?
这是 CompareTo
的实现在属性中:
public int CompareTo(Attribute other)
{
return Id.CompareTo(other.Id);
}
Id
类型为 Guid
.
这是 Page 上的 AssociatedAttributes 属性:
public List<Attribute> AssociatedAttributes
{
get
{
List<Attribute> list = new List<Attribute>( );
using (
PredictiveRecommendor dbContext =
new PredictiveRecommendor()){
if ( dbContext != null )
{
IQueryable<Attribute> query = from a in dbContext.PageAttributes
where a.Page.Id.Equals(this.Id)
select a.Attribute;
list = query.ToList();
}
}
return list;
}
}
(dbContext 是一个 Telerik OpenAccess 上下文)
更新:这是最终起作用的:在 Page 中是以下方法:
public int numberOfIntersectedAssociatedAttributes ( Page other )
{
using ( PredictiveRecommendor dbContext = new PredictiveRecommendor( ) )
{
IQueryable<Attribute> thisAssocAttributes = from a in dbContext.PageAttributes
where a.Page.Id.Equals( this.Id )
select a.Attribute;
IQueryable<Attribute> otherAssocAttributes = from a in dbContext.PageAttributes
where a.Page.Id.Equals( other.Id )
select a.Attribute;
IQueryable<Attribute> interSection = thisAssocAttributes.Intersect( otherAssocAttributes );
return interSection.ToList( ).Count;
}
}
它很丑,但它有效。
最佳答案
考虑以下 Page
的实现:
public class Page
{
public List<Attribute> AssociatedAttributes
{
get
{
return new List<Attribute>() {
new Attribute { Value = "a" },
new Attribute { Value = "b" },
new Attribute { Value = "c" },
};
}
}
}
这里是 AssociatedAttributes
属性每次都返回不同的列表 AssociatedAttributes
叫做。此外,列表中的实际项目是在每次调用该属性时构建的,它不仅仅是返回对完全相同的 Attribute
的引用。对象。自 Attribute
(我假设)不会覆盖 Equals
或 GetHashCode
, 它将使用默认的 object
实现,当且仅当它们引用相同的对象时才认为对象相等。由于您的两个列表中的对象没有引用相同的对象,因此它们彼此都不相等,即使它们在内部可能具有相同的值。
事实Attribute
工具 IComparable
是无关紧要的。
有几种可能的方法可以改变行为:
与其在属性 getter 中构造新对象,不如返回对相同实际对象的引用。这可能意味着为该属性提供一个私有(private)支持字段,构造一次对象,然后返回对同一列表的引用。
覆盖 Equals
和 GetHashCode
在Attribute
依赖于它的值,而不是它的引用。惯例会规定只有在对象不可变时才这样做,就像处理具有变异的对象一样 GetHashCode
值(value)观是……困难的。你可以实现 IEquatable
除此之外,如果您愿意,还可以提供静态类型的 Equals
方法。请注意,覆盖 GetHashCode
是至关重要的如果你实现IEquatable
,如果您仍然希望它有用的话。
创建一个实现 IEqualityComparer<Attribute>
的新对象.这将是 Attribute
外部的对象知道如何根据 Equals
以外的东西比较它们是否相等和 GetHashCode
对象本身的实现。将这种类型的实例提供给 Intersect
和 Distinct
. (它们每个都有自定义相等比较器的重载。)
关于c# - 有人可以向我解释 LINQ 的相交吗?我不明白为什么这不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18365587/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!