我有这个代码,我需要能够搜索HierarchyItem
的不同列表并返回正确类型的列表
即Hierarchy h = new Hierarchy();
//add a load of items of HierarchyItemA type;
List<HierarchyItemA> results = h.Search("text");
CODE:
public class Hierarchy
{
private List<HierarchyItem> items;
public Hierarchy()
{
items = new List<T>();
}
public void AddItem(HierarchyItem item)
{
items.Add(item);
}
public List<T> Search(string searchText)
{
List<T> results = new List<T>();
foreach (HierarchyItem item in items)
{
if (item.DisplayText().ToLower().Contains(searchText.ToLower()))
{
results.Add(item);
}
}
return results;
}
}
public abstract class HierarchyItem
{
public string DisplayText()
{
//returns a string
}
}
public class HierarchyItemA : HierarchyItem
{
//do whatever
}
public class HierarchyItemB : HierarchyItem
{
//do whatever
}
干杯
编辑: 有几个层次结构,每个层次结构中只有一个类型。 Hierarchy.Search(text)应该返回一个包含正确类型项的列表(正确的类型为A或B)
答案 0 :(得分:2)
好的,我想我明白你现在要做的是什么。谢谢你澄清。
首先,您需要将Hierarchy
替换为public class Hierarchy
,并将public class Hierarchy<T>
替换为T
。我们还会对其HierarchyItem
必须是public class Hierarchy<T> where T : HierarchyItem
。
private List<HierarchyItem> items
我们将<{1}}替换为
private List<T> items;
和public void AddItem(HierarchyItem item)
与
public void AddItem(T item)
最后,方法搜索中的行foreach (HierarchyItem item in items)
应替换为
foreach(T item in items).
因此,我们最终得到了
public class Hierarchy<T> where T: HierarchyItem {
List<T> items;
public Hierarchy() {
items = new List<T>();
}
public void AddItem(T item) {
items.Add(item);
}
public List<T> Search(string searchText) {
List<T> results = new List<T>();
foreach (T item in items) {
if (item.DisplayText().ToLower().Contains(searchText.ToLower())) {
results.Add(item);
}
}
return results;
}
}
这应该是你正在寻找的。 p>
答案 1 :(得分:0)
我认为你的意思是这个,但Jason的回答是正确的。
public List<T> Search(string searchText) where T : HierarchyItem
{
List<T> results = new List<T>();
foreach (HierarchyItem item in items)
{
if (item.DisplayText().ToLower().Contains(searchText.ToLower()))
{
T castedItem = item as T;
if(castedItem != null )
results.Add(item);
}
}
return results;
}
答案 2 :(得分:0)
public List<T> Search(string searchText) where T: HirearchyItem
{
return Items.OfType<T>().Where(t => t.DisplayText.ToUpper().Contains(searchText.ToUpper())).ToList<T>();
}
但是如果设计的一部分是任何Hirearchy只能包含单个HirearchyItem类型的项目,那么你可能想让Hirearchy本身成为一个通用类。
说实话,Hirearchy实际上只是List的包装器,为什么不在为T实现执行此搜索的IHasDisplayText时为DisplayText和List的扩展方法创建一个接口?