用法一:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);
List<object> data = new List<object>();
data.Add(new { name = "测试" });
data.Add(new { name = "测试" });
data.Add(new { name = "测试" });
Console.WriteLine(JsonConvert.SerializeObject(data.Distinct().ToList()));
该用法会直接将列表中的相同的数据进行排重处理,相同实体最后只会输出一个实体,但不适合自定义排重,比如只按照某个具体的属性进行排重的时候就不适用了。
用法二:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource>? comparer);
internal class TestEntity
{
public string Name { get; set; }
public string Description { get; set; }
}
internal class TestEntityComparer : IEqualityComparer<TestEntity>
{
public bool Equals(TestEntity? x, TestEntity? y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false;
return x.Name.Equals(y.Name);
}
public int GetHashCode([DisallowNull] TestEntity obj)
{
if (Object.ReferenceEquals(obj, null)) return 0;
return obj.Name.GetHashCode();
}
}
internal class Program
{
private static void Main(string[] args)
{
List<TestEntity> data = new List<TestEntity>();
data.Add(new TestEntity{ Name = "成都" , Description = "不吃**" });
data.Add(new TestEntity { Name = "成都" ,Description = "就吃**" });
data.Add(new TestEntity { Name = "重庆" , Description = "**火锅底料" });
var data1 = data.Distinct(new TestEntityComparer()).ToList();
Console.WriteLine(JsonConvert.SerializeObject(data1));
}
}
该用法需要新建类去继承IEqualityComparer<实体>接口,然后实现接口的两个方法,在方法中自定义排重条件。
用法三:
还可以尝试去使用 Linq 中的 group by ,但是有点耗性能,就不推荐了。