LinQ:?:选择查询中的运算符

时间:2012-12-17 23:52:44

标签: linq c#-4.0

我有一个如下查询。任何人都知道为什么?:部分总是返回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();

3 个答案:

答案 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();

如果trueb中包含来自EList的项目,则应该并且肯定会产生OList。如果您始终获得false,则表示EListOList不包含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)