我有一个界面和两个类:
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;
}
现在我想创建一个包含两个类型First
和Second
列表的第三个类,并编写一个方法,根据类型搜索特定的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吗?
答案 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;
}
}
除了First
或Second
对象之外,还有一个额外的好处就是不允许使用除IIdent
或public 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等的支持。