Список поиска <Items>, затем измените на Список <ItemTypeA: Item> - PullRequest
2 голосов
/ 12 января 2010

У меня есть этот код, и мне нужно иметь возможность искать в различных списках HierarchyItem s и возвращать список правильного типа
т.е. Hierarchy h = new Hierarchy();
//add a load of items of HierarchyItemA type;
List<HierarchyItemA> results = h.Search("text");

КОД:

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
}

Приветствия

EDIT: Есть несколько иерархий, каждая из которых имеет только один тип. Hierarchy.Search (текст) должен возвращать список, содержащий элементы правильного типа (правильного типа A или B)

Ответы [ 3 ]

2 голосов
/ 12 января 2010

Хорошо, я думаю, что понимаю, что вы пытаетесь сделать сейчас. Спасибо за разъяснения.

Сначала вам нужно объявить класс Hierarchy как общий, заменив public class Hierarchy на public class Hierarchy<T>. Мы также установим ограничение на то, что T должно быть HierarchyItem.

public class Hierarchy<T> where T : HierarchyItem

Мы заменим private List<HierarchyItem> items на

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

И это должно быть то, что вы ищете.

0 голосов
/ 12 января 2010

Wow, способ много кода для этих других ответов. Это проблема с одной строкой.

public List<T> Search(string searchText) where T: HirearchyItem
    {
        return Items.OfType<T>().Where(t => t.DisplayText.ToUpper().Contains(searchText.ToUpper())).ToList<T>();   
    }

Но если часть плана заключается в том, что любая Иерархия может содержать элементы только одного типа HirearchyItem, то вы можете сделать сам Иерархию универсальным классом.

По правде говоря, Hirearchy - это просто оболочка для List, почему бы вам просто не создать интерфейс для DisplayText и метод расширения для List, когда T реализует IHasDisplayText, который выполняет этот поиск?

0 голосов
/ 12 января 2010

Я думаю, что вы имеете в виду это, однако ответ Джейсона так же правильно.

 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; 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...