原文出处:http://write.blog.csdn.net/postedit
【问题:】
static void Main(string[] args)
{
List<StudentResult> StudentNewList = new List<StudentResult>();
StudentNewList.Add(new StudentResult("张三", "100", "男"));
StudentNewList.Add(new StudentResult("张三", "101", "女"));
StudentNewList.Add(new StudentResult("李四", "102", "女"));
List<StudentResult> StudentOldList = new List<StudentResult>();
StudentOldList.Add(new StudentResult("张三", "100", "男"));
StudentOldList.Add(new StudentResult("张三", "101", "女"));
StudentOldList.Add(new StudentResult("李四", "102", "女"));
foreach (StudentResult item in StudentNewList)
{
if (StudentOldList.Contains(item))
{
StudentOldList.Remove(item);
}//三条数据都是一样的 为啥就跑不到if语句里面来呢
}
}
class StudentResult
{
public string Name { get; set; }
public string Id { get; set; }
public string Ex { get; set; }
public StudentResult()
{
}
public StudentResult(string name, string id, string ex)
{
this.Name = name;
this.Id = id;
this.Ex = ex;
}
}
【分析】
因为List中每项都是引用类型(对象),所以是否含有某个子项,是看他们是否指向相同的地址。
【解决办法】
List<T> 的contains方法比较的是T的Equals方法,楼主需要重写Equals及GetHashCode方法,详见http://bbs.csdn.net/topics/390617586
【折衷写法】
StudentOldList.Contains(item)
改写为:
StudentOldList.Any(x => x.Name == item.Name && x.Id == item.Id && x.Ex == item.Ex)
或:
StudentOldList.Exists(x => x.Name == item.Name && x.Id == item.Id && x.Ex == item.Ex)