LINQ中的“equals”关键字是否会检查左右对象是否相同 记忆或检查他们的内容?
答案 0 :(得分:2)
答案 1 :(得分:1)
这取决于对象。如果它是值类型,通常比较vaules,它是引用类型,比较引用,除非重写Equals()方法。
来自MSDN:
Equals的默认实现 支持引用相等 引用类型和按位相等 对于价值类型。参考平等 表示对象引用 比较指的是同一个对象。 按位相等意味着对象 被比较的具有相同的二进制 表示。
请注意,派生类型可能 将Equals方法重写为 实现价值平等。
答案 2 :(得分:0)
连接查询中的'equals'使用默认的相等比较器来使用键控查找来比较键。连接在Enumerable.Join中实现,键可以是值或引用。 使用Linq to Sql查询时,键通常是一个值,因为主键通常映射到值类型。但是,如下面的代码说明,equals比较可以是值,也可以是引用,它们适用于键类型:
KeyObj k1 = new KeyObj(); k1.Id = 1001;
KeyObj k2 = new KeyObj(); k2.Id = 1002;
KeyObj k3 = new KeyObj(); k3.Id = 1003;
KeyObj k4 = new KeyObj(); k4.Id = 1004;
KeyObj k5 = new KeyObj(); k4.Id = 1005;
List<Foo> foos =
new List<Foo>()
{
new Foo("o1",k1),
new Foo("o2",k2),
new Foo("o4",k5)
};
List<Bar> bars =
new List<Bar>()
{
new Bar("o2",k1),
new Bar("o3",k2),
new Bar("o4",k4),
new Bar("o5",k5)
};
var foobar = from f in foos
join b in bars on f.Ko equals b.Ko
select f.Name + " in foos joined by reference with " + b.Name + " in bars ";
foreach (var v in foobar)
{
Debug.WriteLine(v);
}
foobar = from f in foos
join b in bars on f.Name equals b.Name
select f.Name + " in foos joined by value with " + b.Name + " in bars ";
foreach (var v in foobar)
{
Debug.WriteLine(v);
}
class KeyObj { public int Id { get; set; } }
class Foo : Base
{
public Foo(string s, KeyObj ko) : base(s, ko) { }
}
class Bar : Base
{
public Bar(string s, KeyObj ko) : base(s, ko) { }
}
class Base
{
string _name = "";
public string Name { get { return _name; }}
KeyObj _ko = null;
public KeyObj Ko { get { return _ko; }}
public Base(string s, KeyObj ko)
{
_name = s;
_ko = ko;
}
}
这个输出是:
o1 in foos通过引用与条形图中的o2连接
o2 in foos通过引用加入o3 in bar
o4 in foos通过引用加入o5 in bar
o2 in foos in value by o2 in bar
o4 in foos in value by o4 in bar
答案 3 :(得分:0)
来自MSDN:http://msdn.microsoft.com/en-us/library/bb311040.aspx
等于运算符
join子句执行equijoin。换句话说,您只能基于两个键相等的匹配。不支持其他类型的比较,例如“大于”或“不等于”。要明确所有连接都是equijoins,join子句使用equals关键字而不是==运算符。 equals关键字只能在join子句中使用,并且它与一个重要方式的==运算符不同。使用equals时,左键消耗外部源序列,右键消耗内部源。外部源仅位于equals左侧的范围内,而内部源序列仅位于右侧的范围内。