使用谓词<T>和内部条件变量

问题描述 投票:0回答:2

考虑从特定类中删除

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

c# list generics refactoring
2个回答
1
投票

正如评论中提到的,使用 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();;
}

0
投票

ckuri的帮助下,这是对我的问题进行更多研究后的正确答案。

旁注:结果可以是另一个 IEnumerable(不一定是 List)。 如何在C#中将List转换为HashSet? [重复]

© www.soinside.com 2019 - 2024. All rights reserved.