重构含Predicate<T>的通用去重方法:如何关联内部T item?
通用List去重方法的问题解决
原MyClass去重逻辑是通过比较对象的myAttribute字段判断重复,而当前重构的RemoveDuplicatedItems方法里,传入的Predicate<T>无法关联循环中的当前item,导致没法正确实现重复判断。
解决方案
把方法的参数从Predicate<T>替换为Func<T, T, bool>——这个委托用来定义两个T类型对象是否视为重复的规则,这样就能在循环里将当前item和已存入uniqueItems的元素做比较。
修改后的完整代码:
public static List<T> RemoveDuplicatedItems<T>(List<T> items, Func<T, T, bool> isDuplicate) { if (items == null) { return new List<T>(); } List<T> uniqueItems = new List<T>(); foreach (T item in items) { // 检查已有列表中是否存在和当前item重复的元素 bool hasDuplicate = uniqueItems.Exists(existing => isDuplicate(existing, item)); if (!hasDuplicate) { uniqueItems.Add(item); } } return uniqueItems; }
调用示例(针对原MyClass场景)
// 传入判断重复的逻辑:比较两个MyClass的myAttribute是否相等 List<MyClass> uniqueMyClasses = RemoveDuplicatedItems(myObjects, (a, b) => a.myAttribute == b.myAttribute);
逻辑说明
原方法里的itm.myAttribute == item.myAttribute,本质是拿已存在的元素和当前元素做比较。换成Func<T, T, bool>后,正好可以把这两个元素作为参数传入,完全匹配原有的去重逻辑,同时保留了方法的通用性。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

