Linq “Lambda表达式”;不在「;C#4.0

Linq “Lambda表达式”;不在「;C#4.0,linq,entity-framework,c#-4.0,Linq,Entity Framework,C# 4.0,我创建这个类是为了测试。 我想比较一下类的列表,得到ListA和ListB之间不同的类。在我的示例中,结果仅获取ListB类 我对字符串列表做同样的精简,并对其进行处理 课堂示例 public class FileNode { public string Source { get; set; } public int Id { get; set; } } List<FileNode> ListA = new List<FileNode> { ne

我创建这个类是为了测试。 我想比较一下类的列表,得到ListA和ListB之间不同的类。在我的示例中,结果仅获取ListB类

我对字符串列表做同样的精简,并对其进行处理

课堂示例

public class FileNode
{
    public string Source { get; set; }
    public int Id { get; set; }
}

List<FileNode> ListA = new List<FileNode>
{
    new FileNode{ Id = 1, Source="a" },
    new FileNode{ Id = 2, Source="b" },
};

List<FileNode> ListB = new List<FileNode>
{
    new FileNode{ Id = 1, Source="a" },
    new FileNode{ Id = 2, Source="b" },
    new FileNode{ Id = 3, Source="c" },
};
List<FileNode> ListAB = ListB.Where(m => !ListA.Contains(m)).ToList();
公共类文件节点
{
公共字符串源{get;set;}
公共int Id{get;set;}
}
List ListA=新列表
{
新文件节点{Id=1,Source=“a”},
新文件节点{Id=2,Source=“b”},
};
列表b=新列表
{
新文件节点{Id=1,Source=“a”},
新文件节点{Id=2,Source=“b”},
新文件节点{Id=3,Source=“c”},
};
List ListAB=ListB.Where(m=>!ListA.Contains(m)).ToList();
字符串示例,它是works

List<string> a = new List<string> {"a","b","c","d","e" };
List<string> b = new List<string> {"a","b","c","d" };
List<string> ab = a.Where(m => !b.Contains(m)).ToList();
List a=新列表{“a”、“b”、“c”、“d”、“e”};
列表b=新列表{“a”、“b”、“c”、“d”};
列表ab=a.Where(m=>!b.Contains(m)).ToList();

那么
Contains
将调用元素上的
Equals
,并且还可能使用
GetHashCode
(我怀疑它,但无论如何都应该一致重写它)。因此,您需要在
FileNode
中重写
Equals(object)
GetHashCode()
。(默认情况下,您将获得引用相等。)


请注意,一旦开始尝试在将在数据库中执行的查询中使用
Contains
,它的行为可能完全不同-它不会在此时查看
Equals
/
GetHashCode
方法。

那么
Contains
将在元素上调用
Equals
,也可能使用
GetHashCode
(我怀疑它,但无论如何你都应该一致地重写它)。因此,您需要在
FileNode
中重写
Equals(object)
GetHashCode()
。(默认情况下,您将获得引用相等。)


请注意,一旦您开始尝试在将在数据库中执行的查询中使用
Contains
,它的行为可能会完全不同-此时它不会查看您的
Equals
/
GetHashCode
方法。

尽管有标记,您没有在代码中的任何地方使用实体框架-如果您开始使用EF,它的行为可能会完全不同。尽管有标记,但您没有在代码中的任何地方使用实体框架-如果您开始使用EF,它的行为可能会完全不同。