搜索列表<items>然后更改为List <itemtypea:=“”item =“”> </itemtypea> </items>

时间:2010-01-12 14:22:53

标签: c# search list

我有这个代码,我需要能够搜索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)

3 个答案:

答案 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;
    }
}

这应该是你正在寻找的。

答案 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的扩展方法创建一个接口?