我有一些包含许多不同方法的对象:
public class Dog: AnimalDescription, IAnimal
public class Cat: AnimalDescription, IAnimal
我想将list
狗和猫放入组合列表中。从那里我想创建幻灯片并分别播放每个项目。所以我做了一个界面:
public Interface IAnimal
public playAnimal()
我有catItem
和dogItem
扩展此界面。
我的问题在于,我无法将列表合并。每次我这样做都说我没有正确地投射它:
我想将它添加到AnimalInterface列表中,并根据类的类型浏览每个catItem或dogItem方法(playAnimal)。我有一个为动物创建幻灯片的课程: 但以下不起作用:
public class AnimalSlideshow
IEnumerable<IAnimal> AnimalItemList;
setUpSlideshow(list<Dogs> newDogData){
var dogList = newDogData.Where(dog => anyDog.anySpecies().toList());
//The dogList is a type List<Dog>.
AnimalItemList = dogList.Cast<IAnimal>();
}
它说我不能施放狗来输入IAnimal。我很困惑,因为我将接口添加到Dog类。我刚刚开始学习C#。有没有我错误理解的东西?
答案 0 :(得分:1)
如果要在动物列表中组合猫和狗,则应使用Enumerable.Concat运算符。
您必须首先将第一个列表转换为IEnumerable<IAnimal>
:
interface IAnimal{}
public class Cat:IAnimal{}
public class Dog:IAnimal{}
var cats=new List<Cat> {
new Cat(),
new Cat()
};
var dogs=new List<Dog> {
new Dog(),
new Dog()
};
var animals = cats.Cast<IAnimal>()
.Concat(dogs)
.ToList();
Debug.Assert(animals.Count == 4);
答案 1 :(得分:0)
考虑这个例子:
class Program {
static void Main(string[] args) {
List<Dog> dogs = new List<Dog>();
dogs.Add(new Dog());
dogs.Add(new Dog());
dogs.Add(new Dog());
var x = dogs.Where(dog => true).ToList();
var y = x.Cast<IAnimal>();
var z = y.ToList();
}
}
public class Dog : IAnimal { }
public class Cat : IAnimal { }
public interface IAnimal { }
在这个例子中,
x
的类型为List<Dog>
y
的类型为IEnumerable<IAnimal>
z
的类型为List<IAnimal>
答案 2 :(得分:0)
我认为我们需要更多代码/更多信息,了解背景情况。我已经使用了你提供的代码,稍微调整它以使其编译,然后在LinqPad中运行它并且它工作得很好(见下文)。我认识到魔鬼在细节中,所以我所做的一些假设可能与你实际做的不同。
void Main()
{
AnimalSlideshow slides = new AnimalSlideshow();
slides.setUpSlideshow(new List<Dog> { new Dog()});
Console.WriteLine("Done!");
}
public interface IAnimal
{
void playAnimal();
}
public class AnimalDescription
{ }
public class Dog : AnimalDescription, IAnimal
{
public void playAnimal() { }
public bool anySpecies() {return true;}
}
public class Cat : AnimalDescription, IAnimal
{
public void playAnimal() {}
}
public class AnimalSlideshow
{
IEnumerable<IAnimal> AnimalItemList;
public void setUpSlideshow(List<Dog> newDogData)
{
var dogList = newDogData.Where(dog => dog.anySpecies()).ToList();
//The dogList is a type List<Dog>.
AnimalItemList = dogList.Cast<IAnimal>();
}
}