在C#
铸造的接口的对象我有一个包含很多不同的方法,几个对象:在C#
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#。有没有我不明白的理解?
如果你想既猫狗动物名单结合起来,你应该使用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);
这很有道理。字典狗列表是否会阻止投射?我正在阅读错误消息,它说我的数据是一个System.Collections.ListDictionaryInternal – lost9123193
考虑这个例子:
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>
的,我认为我们需要更多的代码/更多信息,在后台发生了什么事情。我已经提供了你提供的代码,稍微调整它来编译,然后在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>();
}
}
谢谢这真的很有帮助。我仍然收到一个错误“无法将对象Dog转换为IAnimal)。字典狗列表是否会阻止投射?我正在阅读错误消息,它说我的数据是一个System.Collections.ListDictionaryInternal – lost9123193
我不会认为是 - Dictionary和List都是IEnumerable,所以不应该改变任何东西。如上所述,显示更多的代码可能有助于发现哪部分是错误的。 – David
仔细看看你的行:'var dogList = newDogData.Where(dog => anyDog.anySpecies()。toList());'与我的行'var dogList = newDogData.Where(dog => dog.anySpecies())。ToList();'我必须改变有几个重要的细节可以让它编译,例如,anyDog是从哪里来的?还要注意Where'Where'的右括号向内移动,我敢打赌你的问题与这条线有关。 – David
'Cast'不返回一个列表。它返回一个'IEnumerable',然后尝试添加一个'ToList'。 – juharr
狗和猫都不是'AnimalItem'。你不应该将它们投射到“IAnimal”吗? –
@jdmdevdotnet是一个*列表*的动物。你输入的内容会丢失。 –