C# 如何分配列表<;熊>;或列表<;山羊>;列出<;IAnimal>;
我有一个接口(C# 如何分配列表<;熊>;或列表<;山羊>;列出<;IAnimal>;,c#,linq,C#,Linq,我有一个接口(IAnimal),它由两个类实现,Bear和Goat 在运行时,我可能会得到一个熊或山羊的列表,但无论它们是哪一个,都需要分配给属性IEnumerable 这是可行的,因为IEnumerable是一个共同变量 但是,我现在需要从IEnumerable中删除项,这当然不起作用 我需要做什么才能删除项目 以下是工作示例: interface IAnimal {} public class Bear : IAnimal {} public class Goat : IAnimal {}
IAnimal
),它由两个类实现,Bear和Goat
在运行时,我可能会得到一个熊或山羊的列表,但无论它们是哪一个,都需要分配给属性IEnumerable
这是可行的,因为IEnumerable
是一个共同变量
但是,我现在需要从IEnumerable
中删除项,这当然不起作用
我需要做什么才能删除项目
以下是工作示例:
interface IAnimal {}
public class Bear : IAnimal {}
public class Goat : IAnimal {}
class Program
{
public static IEnumerable<IAnimal> CouldBeBearsOrGoats { get; set; }
static void Main(string[] args) {
var list = new List<int>() {1, 2, 3};
var bears = from l in list select new Bear();
var goats = from l in list select new Goat();
CouldBeBearsOrGoats = bears;
CouldBeBearsOrGoats = goats;
//How do I now remove an item?
}
}
接口IAnimal{}
公共类Bear:IAnimal{}
公营山羊:IAnimal{}
班级计划
{
public static IEnumerable可以承载OATS{get;set;}
静态void Main(字符串[]参数){
var list=newlist(){1,2,3};
var Bear=从列表中的l选择新Bear();
var山羊=从列表中的l选择新山羊();
couldbearshoats=熊;
可能是山羊;
//现在如何删除项目?
}
}
如果我将couldbearsorgoats更改为一个列表,那么我可以删除项,但我不能再分配任何一种类型
public static List<IAnimal> CouldBeBearsOrGoats { get; set; }
公共静态列表可以承载OATS{get;set;}
这份清单将会很长,所以我不想只是复制一份清单,然后再复制一份。我所做的是处理列表中的每一项,然后将其删除,直到列表为空。我认为只有使用强类型集合1是不容易的,因为没有协变集合接口公开
删除方法
我认为有两种可能的解决方案:
- 使用非通用的
ICollection
接口,该接口由List
实现:
缺点是实现ICollection
的集合可能无法实现ICollection
- 使用动态:
dynamic collection = CouldBeBearsOrGoats
collection.Remove(whatever);
但它可能比以前的方法慢
1假设您不想通过将项强制转换为IAnimal
来更改集合的实际类型,那么可以在LINQ查询中添加一个Cast
调用,以便它将IEnumerable
转换为IEnumerable
(这实际上为每个强制转换的元素创建一个新的迭代器)
var Bear=(从列表中的l中选择new Bear()).Cast().ToList();
var山羊=(从列表中的l中选择new Goat()).Cast().ToList();
现在,熊
和山羊
都是IAnimal
的可枚举项,您可以对它们进行操作。因为您的源数据无论如何都是IEnumerable的,您必须将其转换为List以添加/删除元素
List<IAnimal> ListOfAnimals1 = bears.Cast<IAnimal>().ToList();
List<IAnimal> ListOfAnimals2 = goats.Cast<IAnimal>().ToList();
List listofaimals1=bears.Cast().ToList();
List LISTOFAMALS2=山羊.Cast().ToList();
@TimSchmelter,列表
不是i集合
,因此它不能解决任何问题。通过提供列表
,用户可以将山羊添加到熊列表中,这在您的系统中可能无效。如果您只想允许删除,可能应该提供类似于IEnumerable animal{get{return{u Animals.AsReadOnly();}}
和void RemoveAnimal(IAnimal animal){u animal.Remove(animal);}
的内容。不知道为什么会被否决;这实际上是一个很好的解决方案。
var bears = (from l in list select new Bear()).Cast<IAnimal>().ToList();
var goats = (from l in list select new Goat()).Cast<IAnimal>().ToList();
List<IAnimal> ListOfAnimals1 = bears.Cast<IAnimal>().ToList();
List<IAnimal> ListOfAnimals2 = goats.Cast<IAnimal>().ToList();