代码之家  ›  专栏  ›  技术社区  ›  ChrisBD

传递和处理包含相同基类型对象的List<>类型

  •  0
  • ChrisBD  · 技术社区  · 17 年前

    考虑以下类别:

    class TypeA;
    class TypeB : TypeA;
    class TypeC : TypeA;
    class TypeD : TypeA;
    

    以及以下清单<>类型:

    List<TypeB> listTypeB;
    List<TypeC> listTypeC;
    List<TypeD> listTypeD;
    

    bool LocateInAnyList(Object1 findObj)
    {
      bool found = false;
    
      found = ContainsProp1(findObj, listTypeB);
      if(!found)
      {
        found = ContainsProp1(findObj, listTypeC);
      }
      if(!found)
      {
        found = ContainsProp1(findObj, listTypeD);
      }
      return found;
    }
    
    
    bool ContainsProp1(Object1 searchFor, List<TypeA> listToSearch)
    {
       bool found = false;
    
       for(int i = 0; (i < listToSearch.Count) & !found; i++)
       {
          found = listToSearch[i].Prop1 == searchFor;
       }
       return found;
    }
    
    5 回复  |  直到 16 年前
        1
  •  5
  •   mqp    17 年前

    对。您需要使“contains”方法通用,并带有约束,以便您只能对从以下对象派生的对象进行操作 TypeA (因此 Prop1 :)

    bool ContainsProp1<T>(Object1 searchFor, List<T> listToSearch) where T : TypeA
    {
       bool found = false;
    
       for(int i = 0; (i < listToSearch.Count) & !found; i++)
       {
          found = listToSearch[i].Prop1 == searchFor;
       }
       return found;
    }
    

    然后,您的第一个方法应该按原样编译。

        2
  •  3
  •   ybo    17 年前

    bool ContainsProp1<T>(Object1 searchFor, List<T> listToSearch) where T : TypeA
    {
       bool found = false;
    
       for(int i = 0; (i < listToSearch.Count) & !found; i++)
       {
          found = listToSearch[i].Prop1 == searchFor;
       }
       return found;
    }
    

    如果你能使用linq,你的代码会比这更清晰。

        3
  •  1
  •   thecoop    17 年前

    你可以做这样的事情(使用lambdas、泛型和类似的好东西):

    public bool LocateInAnyList(Object1 obj)
    {
        return SearchList(listTypeB, obj) || SearchList(listTypeC, obj) || SearchList(listTypeD, obj);
    }
    
    private static bool SearchList<T>(List<T> list, Object1 obj) where T : TypeA
    {
        return list.Exists(item => item.Prop1 == obj);
    }
    
        4
  •  -1
  •   Joel Martinez    17 年前

    由于增加了方差/协方差支持,在C#4.0问世之前,你真的无法以这种方式做到这一点。

    现在,您可以通过允许用户传入IEnumerable,并在将对象转换为TypeA的同时循环它来破解它

    bool ContainsProp1(Object1 searchFor, IEnumerable listToSearch)
    {
       bool found = false;
    
       foreach(object obj in listToSearch)
       {
          found = ((TypeA)obj).Prop1 == searchFor;
          if (found) break;
       }
       return found;
    }
    
        5
  •  -1
  •   Eduardo Scoz    17 年前

    对。首先,您可以通过更改其签名使该方法通用,如下所示:

    bool ContainsProp(Object searchFor, List<T> listToSearch) : where T : TypeA {}
    

    这将允许您传递您拥有的任何列表。

    其次,我将更改第二个参数以接收列表数组:

    bool ContainsProp<T>(Object searchFor, List<T> [] listsToSearch) where T : TypeA {}
    

    found = ContainsProp(objToSearch, listA, listB, listC);