使用List依赖于类型的通用方法

时间:2014-04-07 11:19:36

标签: c# generics

我有一个界面和两个类:

public interface IIdent
{
   int Id { get; set; }
}

public class First : IIdent
{
   public int Id { get; set; }
   public string Name;
}

public class Second : IIdent
{
   public int Id { get; set; }
   public string Surname;
}

现在我想创建一个包含两个类型FirstSecond列表的第三个类,并编写一个方法,根据类型搜索特定的List:

public class myClass
{
   List<First> firstItems;
   List<Second> secondItems;

    public int SearchOf<T>(T pattern) where T : IIdent
    {
        List<T> searched;
        if (pattern is First) searched = firstItemsas List<T>;
        else if (pattern is Second) searched = secondItems as List<T>;
        else return -1;
        for (int index = 0; index < searched.Count; index++)
            if (pattern.Id == searched[index].Id)
                return index;
        return -1;
    }
}

上面的代码有效,但是可以更容易 - 该方法会根据模式的类型搜索特定的List吗?

2 个答案:

答案 0 :(得分:4)

在这种情况下,我不会公开泛型方法,我会这样做:

public class myClass
{
    List<First> firstItems;
    List<Second> secondItems;

    public int SearchOf(First pattern)
    {
        return SearchOf(pattern, firstItems);
    }

    public int SearchOf(Second pattern)
    {
        return SearchOf(pattern, secondItems);
    }

    private static int SearchOf<T>(T pattern, IList<T> searched) where T : IIdent
    {
        for (int index = 0; index < searched.Count; index++)
            if (pattern.Id == searched[index].Id)
                return index;
        return -1;
    }
}

除了FirstSecond对象之外,还有一个额外的好处就是不允许使用除IIdentpublic int SearchOf(First pattern) { return SearchOf(pattern.Id, firstItems); } public int SearchOf(Second pattern) { return SearchOf(pattern.Id, secondItems); } private static int SearchOf(int id, IEnumerable<IIdent> searched) { int index = 0; foreach (var ident in searched) { if (ident.Id == id) return index; index++; } return -1; } 对象之外的任何内容调用SearchOf,即使它实现了{{1}}。

我也支持避免使方法过于具体,所以这里有另一个版本:

{{1}}

答案 1 :(得分:0)

我宁愿做一个通用的MyClass。类似的东西:

public class MyClass<T> where T : IIdent
{
    IList<T> items = new List<T>();

    public int SearchOf(T pattern)
    {
        for (int index = 0; index < items.Count; index++)
            if (pattern.Id == items[index].Id)
                return index;
        return -1;
    }
}

后来&#34;第一&#34;和&#34;第二&#34;可以拥有自己的MyClass实现,而不是将两个集合放入一个MyClass实例中。将一个集合保存在MyClass的一个实例中是一种更好的做法。

当你要搜索时,你会做类似的事情:

void Main()
{
    Search<First>(new First() { Id = 1 });
}

void Search<T>(T pattern) where T : IIdent
{
    var myClass = new MyClass<T>();
    myClass.SearchOf(pattern);
}

之后您可以轻松添加对Third等的支持。