【问题标题】:Searching List<Items> then change to List<ItemTypeA : Item>搜索 List<Items> 然后更改为 List<ItemType : Item>
【发布时间】:2010-01-12 14:22:53
【问题描述】:

我有此代码,我需要能够搜索 HierarchyItems 的不同列表并返回正确类型的列表
Hierarchy h = new Hierarchy();
//add a load of items of HierarchyItemA type;
List&lt;HierarchyItemA&gt; 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
}

干杯

编辑: 有几个层次结构,每个层次结构中只有一种类型。 Hierarchy.Search(text) 应该返回一个列表,其中包含正确类型的项目(正确的类型为 A 或 B)

【问题讨论】:

  • 除非 HTML 吞噬了你的 ,否则你的代码不会编译。
  • 里面有一个 但我可能已经删除它试图做一些事情大声笑

标签: c# search list


【解决方案1】:

好的,我想我明白你现在想要做什么了。感谢您的澄清。

首先,您需要将public class Hierarchy 替换为public class Hierarchy&lt;T&gt;,将Hierarchy 类声明为泛型。我们还将对其施加约束,即T 必须是HierarchyItem

public class Hierarchy<T> where T : HierarchyItem

我们将private List&lt;HierarchyItem&gt; 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;
    }
}

这应该是你正在寻找的。​​p>

【讨论】:

    【解决方案2】:

    哇,其他答案的代码太多了。这是一个单行问题。

    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 的扩展方法?

    【讨论】:

    • 是的,如果他使用的是 .NET 3.5,他没有指定。
    • 如果他不是,那么他应该是。 2.0 打击猴子块。
    • 注意:单行并不好,可读的代码(不适合你,但适合其他人)是首选!
    【解决方案3】:

    我想你的意思是这样,但杰森的回答同样正确。

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

    【讨论】:

    • 错误:类型参数“T”不能与“as”运算符一起使用,因为它没有类类型约束,也没有“类”约束
    • @harryovers,抱歉忘记添加约束。编辑答案。
    猜你喜欢
    • 2014-01-24
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多