看代码
public class C { public int Id { get; set; } public string Name { get; set; } public C(int id, string name) { Id = id; Name = name; } } C c1 = new C(1, "a"); C c2 = new C(2, "b"); C c3 = new C(3, "c"); C c4 = new C(4, "d"); C c5 = new C(1, "a"); List<C> list = new List<C>(); list.Add(c1); list.Add(c1); list.Add(c2); list.Add(c3); list.Add(c4); list.Add(c5); int count = 0; count = list .Distinct() .Count(); Response.Write(count); // 5,两次 Add(c1),被识别为重复。 count = list .Select(m => new C(m.Id, m.Name)) .Distinct() .Count(); Response.Write(count); // 6,新创建 C 对象,每次都不一样。 count = list .Select(m => new { m.Id, m.Name }) .Distinct() .Count(); Response.Write(count); // 4,匿名对象,成员值重复就是重复,即不是 5,也不是 6。 count = list .Select(m => new { m.Id }) .Distinct() .Count(); Response.Write(count); // 4,匿名对象,成员值重复就是重复。 count = list .Select(m => m.Id) .Distinct() .Count(); Response.Write(count); // 4,这个就是普通的值比较了,好理解。
如上,list 添加了 2 次 c1,还添加了一次 c5,c5 的值(仅限值)和 c1 相同。
结论
由于是类,故 Distinct 不是按值比较的,所以虽然 2 次 c1 被认为是相同的,但 c5 却不认为与 c1 相同。
特别要说明的是:Select 时,创建新对象,与创建新匿名对象,对重复性的认定不同。