我有一个如下查询。任何人都知道为什么?:部分总是返回false值,尽管LIST中有item包含。或者任何人都有更好的想法写这个查询,随时回复这里。谢谢。
List EList = new List();
EList.Add(new EmployeeInfo(1, "a1", "b1"));
EList.Add(new EmployeeInfo(2, "a2", "b2"));
List OList = new List();
OList.Add(new EmployeeInfo(1, "a1", "b1"));
OList.Add(new EmployeeInfo(2, "a2", "b2"));
OList.Add(new EmployeeInfo(3, "aa2", "bb2"));
var results = (
from e in b
select new
{
Id = e.ID,
Name = e.Name,
Email = e.Email,
IS_Elist = (EList.Contains(e))?true:false,
IS_Olist = (OList.Contains(e)) ? true : false,
}
).ToList();
答案 0 :(得分:2)
首先,您可以简化查询 - expression ? : true : false
仅相当于expression
,我们会得到以下内容。
var results = b.Select(e => new
{
Id = e.ID,
Name = e.Name,
Email = e.Email,
IS_Elist = EList.Contains(e),
IS_Olist = OList.Contains(e)
})
.ToList();
如果true
或b
中包含来自EList
的项目,则应该并且肯定会产生OList
。如果您始终获得false
,则表示EList
和OList
不包含b
中的任何内容。请记住,您可能正在进行参考比较,因此
new EmployeeInfo(1, "a", "b") == new EmployeeInfo(1, "a", "b")
通常会产生false
。
我猜你实际上打算通过ID
进行比较。
var results = b.Select(e => new
{
Id = e.ID,
Name = e.Name,
Email = e.Email,
IS_Elist = EList.Any(x => x.ID == e.ID),
IS_Olist = OList.Any(x => x.ID == e.ID)
})
.ToList();
替代解决方案是在EmployeeInfo
上实施IEquatable<T>
或覆盖Equals()
, GetHashCode()
and the equality operator。您应该注意所有实现都会产生一致的结果,否则您会以很多混淆为例,例如Object.Equals()
和等于运算符会产生不同的结果。
答案 1 :(得分:0)
您的相等检查可能与您对EmployeeInfo的预期不同。要确认,请在上面发布的代码段底部进行确认,然后尝试查看是否返回true。
var is_olist = OList.Contains(new EmployeeInfo(1, "a1", "b1"));
如果返回false,则需要考虑使用更简单但仍然唯一的比较实例(例如ID成员),或者在EmployeeInfo中实现等于你自己。
答案 2 :(得分:0)
在EmployeeInfo类中实现Equals和Equality ==运算符。
Implementing the Equals Method
Guidelines for Implementing Equals and the Equality Operator (==)