基于类型的List集合的自定义方法

时间:2014-01-30 15:50:56

标签: c#

有没有办法扩展C#List类,允许我附加一种特定于一种类型的自定义方法?

在我的示例中,我有一个LatestNews对象列表。其中每个都包含Category类型的属性。

我想要做的是将自定义方法附加到List<>,该方法将返回Category集合中所有唯一LatestNews个对象。

我有以下工作使用泛型,但我注意到,如果我然后声明一个不同类型的List<>(即字符串),则此方法可用。

public static List<LatestNewsCategory> getUniqueCategories<T>(this IList<T> list) 
{
    List<LatestNewsCategory> catList = new List<LatestNewsCategory>();
    List<LatestNews> myNewsList = (List<LatestNews>)list;

    foreach (LatestNews news in myNewsList)
    {
        if (catList.Find(LatestNewsCategory => LatestNewsCategory.ID == news.Category.ID) == null)
        {
            catList.Add(news.Category);
        }
    }

    return catList;
}

我应该采用不同的方法吗?

我是否应该考虑创建一个扩展List的自定义类?

由于

3 个答案:

答案 0 :(得分:2)

您应该在签名中更改通用类型。

改变它是这样的:

public static List<LatestNewsCategory> getUniqueCategories(this IList<LatestNews> list) 

答案 1 :(得分:0)

如果您希望此扩展程序仅用于LatestNews列表,请使用LatestNews类型对您的列表进行参数化:

public static List<LatestNewsCategory> getUniqueCategories(
    this IList<LatestNews> list) 
{
    // ...
}

附注1 - 我们为公共成员使用PascalCase名称,例如GetUniqueCategories

附注2 - 您可以使用LINQ从最新新闻列表中获取不同的类别:

return list.Select(n => n.Category)
           .GroupBy(c => c.ID)
           .Select(g => g.First())
           .ToList();

或者如果您在Equals类型上覆盖了GetHashCodeLatestNewsCategory,那么您可以简单地

return list.Select(n => n.Category).Distinct().ToList();   

附注3 - 您可以为IEnumerable<LatestNews>创建扩展名,因此您只需枚举列表项。

答案 2 :(得分:0)

你试过衍生吗?如果你这样做,试着把它保持在通用的一面,比如:

class SpecializedList<T> extends List<T>
{
    // put your specialized generic<T> methods here
}

重用代码可能是件好事,但是当你说2或3个专门的方法时,这更有意义。