c#对象集合去重_C# List集合去重操作注意点

今天调试代码时发现list的distinct方法在对引用类型操作时并没有去重,后来查阅资料发现list去重操作对象集合时比较的是对象的一个个引用地址,

因为集合里的对象都是一个个单独的实例,所以并不会把内容相同的元素去掉,要想真正去重还是要自己写方法筛选,但是值类型集合的就可以直接操作,包括Unoin,Intersect方法。

当默认distinct方法不满足需求时,可以使用他的重载方法自定义一个比较器实现IEqualityComparer接口就行了

这是一个在网上找的可拓展的泛型去重方法

///

/// 可拓展的List对象集合去重比较器

///

/// 要去重的对象类

/// 自定义去重的字段类型

public class Compare : IEqualityComparer

{

private Func _getField;

public Compare(Func getfield)

{

this._getField = getfield;

}

public bool Equals(T x, T y)

{

return EqualityComparer.Default.Equals(_getField(x), _getField(y));

}

public int GetHashCode(T obj)

{

return EqualityComparer.Default.GetHashCode(this._getField(obj));

}

}

///

/// 自定义Distinct扩展方法

///

/// 要去重的对象类

/// 自定义去重的字段类型

/// 要去重的对象

/// 获取自定义去重字段的委托

///

public static IEnumerable MyDistinct(this IEnumerable source, Func getfield)

{

return source.Distinct(new Compare(getfield));

}

调用方式是 List.MyDistinct(s => s.ActivityId).ToList() //可以传委托也可以是匿名方法(lamda表达式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 可以使用 Linq 的 Distinct 方法进行集合去重,但是默认情况下 Distinct 只能根据元素的值进行比较,无法根据多个字段进行比较。 要实现多字段去重,可以使用 Linq 的 GroupBy 方法先按照指定字段进行分组,然后再取每组的第一个元素,即可实现多字段去重。 示例代码如下: ```csharp class Person { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } } List<Person> persons = new List<Person> { new Person { Name = "Tom", Age = 18, Address = "Beijing" }, new Person { Name = "Jack", Age = 20, Address = "Shanghai" }, new Person { Name = "Tom", Age = 18, Address = "Beijing" }, new Person { Name = "Tom", Age = 22, Address = "Shenzhen" }, new Person { Name = "Mike", Age = 20, Address = "Shanghai" } }; var distinctPersons = persons.GroupBy(p => new { p.Name, p.Age, p.Address }) .Select(g => g.First()) .ToList(); ``` 上述代码,首先定义了一个 Person 类,包含了三个字段:Name、Age 和 Address。然后创建了一个包含了几个 Person 对象List。 接下来使用 Linq 的 GroupBy 方法将 Person 对象按照 Name、Age 和 Address 进行分组,得到一个键值对集合,其键为一个包含三个字段的匿名类型对象,值为该分组下的所有 Person 对象。然后使用 Select 方法取每个分组的第一个元素,即可得到去重后的 Person 集合。最后通过 ToList 方法将结果转换为 List
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值