-1

我有一个如下查询。任何人都知道为什么?:部分总是返回错误值,尽管 LIST 中有项目包含。或者任何人有更好的想法来编写此查询,请随时在此处回复。谢谢。

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();
4

3 回答 3

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包含在EListor中,这应该并且肯定会产生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();

另一种解决方案是实现IEquatable<T>onEmployeeInfo或覆盖Equals()GetHashCode()以及相等运算符。你应该注意你的所有实现都会产生一致的结果,否则你会以很多困惑结束,例如为什么Object.Equals()和相等运算符会产生不同的结果。

于 2012-12-18T00:03:57.417 回答
0

您对 EmployeeInfo 的相等性检查可能与您期望的不同。为了确认,在您上面发布的代码段的底部,试试这个,看看它是否返回 true。

var is_olist = OList.Contains(new EmployeeInfo(1, "a1", "b1"));

如果这返回 false,您需要考虑使用更简单但仍然唯一的东西来比较实例(例如 ID 成员),或者自己在 EmployeeInfo 中实现 equals。

于 2012-12-18T00:00:47.067 回答
0

在 EmployeeInfo 类中实现 Equals 和 Equality == 运算符。

实现 Equals 方法

实现等式和等式运算符 (==) 的指南

于 2012-12-18T00:01:01.523 回答