C# 传递和处理列表<&燃气轮机;包含相同基类型对象的类型

C# 传递和处理列表<&燃气轮机;包含相同基类型对象的类型,c#,inheritance,collections,C#,Inheritance,Collections,考虑以下类别: class TypeA; class TypeB : TypeA; class TypeC : TypeA; class TypeD : TypeA; 以及以下列表类型: 列表列表类型b; 列表c; 列表类型; 现在TypeA有一个Object1类型的Prop1属性,我想找到哪个列表中存储了一个Prop1为给定值的项。有没有一种方法可以让我做如下的事情,这样我只需要写一次搜索代码 bool LocateInAnyList(Object1 findObj) { bool f

考虑以下类别:

class TypeA;
class TypeB : TypeA;
class TypeC : TypeA;
class TypeD : TypeA;
以及以下列表类型:

列表列表类型b;
列表c;
列表类型;
现在TypeA有一个Object1类型的Prop1属性,我想找到哪个列表中存储了一个Prop1为给定值的项。有没有一种方法可以让我做如下的事情,这样我只需要写一次搜索代码

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;
}
bool locateInyList(Object1 findObj)
{
bool-found=false;
found=ContainsProp1(findObj,listTypeB);
如果(!找到)
{
found=ContainsProp1(findObj,listTypeC);
}
如果(!找到)
{
found=ContainsProp1(findObj,listTypeD);
}
发现退货;
}
bool ContainsProp1(Object1搜索、列表列表搜索)
{
bool-found=false;
for(int i=0;(i
由于增加了方差/协方差支持,在C#4.0问世之前,您无法真正做到这一点

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

bool ContainsProp1(Object1 searchFor, IEnumerable listToSearch)
{
   bool found = false;

   foreach(object obj in listToSearch)
   {
      found = ((TypeA)obj).Prop1 == searchFor;
      if (found) break;
   }
   return found;
}

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

bool ContainsProp1(Object1 searchFor,List listToSearch),其中T:TypeA
{
bool-found=false;
for(int i=0;(i
您的第一个方法应该按原样编译。

您可以使用泛型

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;
}
bool ContainsProp1(Object1 searchFor,List listToSearch),其中T:TypeA
{
bool-found=false;
for(int i=0;(i

如果您可以使用linq,那么您的代码可以更加清晰。

您可以这样做(使用lambdas和泛型以及类似的好东西):

public bool locateinylist(Object1 obj)
{
返回SearchList(listTypeB,obj)| | SearchList(listTypeC,obj)| | SearchList(listTypeD,obj);
}
私有静态布尔搜索列表(列表列表,Object1对象),其中T:TypeA
{
返回列表.Exists(item=>item.Prop1==obj);
}

是。首先,您可以通过如下更改其签名,使该方法成为泛型方法:

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

在这种情况下,协方差是不必要的。你确定这样编译吗?我删除了额外键入的冒号;除此之外,是的,在我看来还不错。Close-不幸的是,ybo语法对于函数定义是正确的,但无论如何都有+1。当我按原样粘贴代码时,IDE突出显示“where”关键字,并出现以下错误:“非泛型声明上不允许约束”来修复它,我必须将其更改为:bool ContainsProp1(Object1 searchFor,List listToSearch)其中T:TypeA{…}就个人而言,我认为这应该是公认的答案。有相当充分的文件证明,这些基于委托的方法比手动遍历列表更快。而且它更优雅。你甚至检查过你的示例编译吗?是的。它不编译,因为我没有显示整个实现,只是方法签名,比如e我在第一行提到。
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;
}
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);
}
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);