考虑从特定类中删除
List
的重复元素,如下所示:
private List<MyClass> RemoveDuplicatedMyClass(List<MyClass> myObjects)
{
List<MyClass> uniqueMyClasses = new List<MyClass>();
foreach (MyClass item in myObjects)
{
if (uniqueMyClasses.FindAll(itm => itm.myAttribute == item.myAttribute).Count == 0)
{
uniqueMyClasses.Add(item);
}
}
return uniqueMyClasses;
}
我想将
RemoveDuplicatedMyClass
重构为通用版本 RemoveDuplicatedItems
,如下所示:
public static List<T> RemoveDuplicatedItems<T>(List<T> items, Predicate<T> match)
{
if (items == null)
{
return new List<T>();
}
List<T> uniqueItems = new List<T>();
foreach (T item in items)
{
// Check if item exists (= already added)! If not add to unique list.
if (uniqueItems.FindAll(match).Count < 1)
{
uniqueItems.Add(item);
}
}
return uniqueItems;
}
问题:如何通过内部
Predicate<T> match
访问 T item
?
正如评论中提到的,使用 Enumerable.DistinctBy 是个好主意,一种解决方案是使用动态对象:
static List<dynamic> RemoveDuplicatedItems(List<dynamic>? items)
{
if (items == null)
{
return new List<dynamic>();
}
return items.DistinctBy(x=>x.MyAttribute).ToList();
}
另一个我认为更好的选择是使用抽象,如果你的类之间有一些共同的属性,你可以创建接口并将 T 的类型定义为该接口的继承者:
static List<T> RemoveDuplicatedItems<T>(List<T>? items) where T:ISomeCommonInterface
{
if (items == null)
{
return new List<T>();
}
return items.DistinctBy(x=>x.MyAttribute).ToList();;
}
在ckuri的帮助下,这是对我的问题进行更多研究后的正确答案。
旁注:结果可以是另一个 IEnumerable(不一定是 List)。 如何在C#中将List转换为HashSet? [重复]