2010-01-12 28 views
2

我有這樣的代碼,我需要能夠通過HierarchyItem期不同列表來查找並返回正確的類型
Hierarchy h = new Hierarchy();
//add a load of items of HierarchyItemA type;
列表List<HierarchyItemA> results = h.Search("text");搜索列表<Items>然後換名單<ItemTypeA:項目>

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(文本)應該返回一個包含正確類型的項目的列表(正確的A或B類型)

+0

除非HTML吞噬您的< or >,否則您的代碼無法編譯。 – leppie

+0

問題是...? –

+0

有一個< and >在裏面,但我可能已經刪除它試圖做一些事情大聲笑 – harryovers

回答

2

好吧,我想我明白你現在想做什麼。感謝澄清。

首先,您需要聲明類Hierarchy爲通用類型,用public class Hierarchy替換爲public class Hierarchy<T>。我們還會對此作出約束,即T必須是HierarchyItem

public class Hierarchy<T> where T : HierarchyItem 

我們將與

private List<T> items; 

public void AddItem(HierarchyItem item)

public void AddItem(T item) 

最後,在方法搜索行foreach (HierarchyItem item in items)取代private List<HierarchyItem> 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

你先生!是一個天才。非常感謝你 – harryovers

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; 
    } 
+0

錯誤:類型參數'T'不能與'as'操作符一起使用,因爲它沒有類類型約束和'類'約束 – harryovers

+0

@harryovers,抱歉忘了添加一個約束..edited回答。 –

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的包裝,爲什麼你不只是爲DisplayText創建一個接口,以及當T實現了這個搜索的IHasDisplayText時爲List創建了一個擴展方法?

+0

是的,也就是說,如果他使用.NET 3.5,他沒有指定。 –

+0

如果他不是,那麼他應該是。 2.0吹猴子塊。 –

+0

注意:一行不是更好,可讀的代碼(不適合你,但對其他人)是首選! – RvdK