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();