§ ITPOW >> 文档 >> C#

C# Linq 去重-Select、Distinct 对唯一性的认定

作者:vkvi 来源:ITPOW(原创) 日期:2022-3-27

看代码

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 时,创建新对象,与创建新匿名对象,对重复性的认定不同。


相关文章