这个当前项目更像是一个更大项目的概念证明。我有两个“表”(在下面列出的表),CatList
和DogList
,它们具有相同的列结构。我希望能够Concat
或Union
这两者,并使用LINQ
对结果集进行查询。有人告诉我,通过实施interfaces
,我将能够取得这些成果。
这是我到目前为止所做的:
static void Main(string[] args)
{
System.Console.Write("Hello World\n");
Dog Dog1 = new Dog { name = "A", age = 1 };
Dog Dog2 = new Dog { name = "B", age = 2 };
Cat Cat1 = new Cat { name = "C", age = 3 };
Cat Cat2 = new Cat { name = "D", age = 4 };
List<Dog> DogList = new List<Dog>();
List<Cat> CatList = new List<Cat>();
DogList.Add(Dog1);
DogList.Add(Dog2);
CatList.Add(Cat1);
CatList.Add(Cat2);
var result = DogList
.Concat(CatList);
}
}
public interface iAnimal
{
string name { get; set; }
int age { get; set; }
}
public class Dog :iAnimal
{
public string name { get; set; }
public int age { get; set; }
}
public class Cat:iAnimal
{
public string name { get; set; }
public int age { get; set; }
}
我可以使用System.Console.Write(Dog1.name);
之类的东西访问我创建的任何对象的任何数据成员,所以我认为我的接口实现是正确的。我的LINQ语句需要更改什么才能有效地Concat / Union我的列表。
我对C#
和面向对象编程很新,所以请提供适合我知识水平的答案。
由于
修改 我道歉,因为我忘记包含我在当前代码中收到的错误消息。
Error 1 'System.Collections.Generic.List<InterfaceTest.Dog>' does not contain a definition for 'Concat' and the best extension method overload 'System.Linq.ParallelEnumerable.Concat<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
Error 2 Instance argument: cannot convert from 'System.Collections.Generic.List<InterfaceTest.Dog>' to 'System.Linq.ParallelQuery<InterfaceTest.Cat>'
答案 0 :(得分:13)
问题在于编译器无法通过连接List<Dog>
和List<Cat>
来确定它应该生成iAnimal
s的集合。默认情况下,它会看到List<Dog>
并期望以下集合也是Dog
的集合。
您可以通过向iAnimal
提供通用参数来明确告诉将所有内容视为Concat
,即
var result = DogList.Concat<iAnimal>(CatList);
然后,您获得result
类型IEnumerable<iAnimal>
。
编辑:如果你坚持使用.NET 3.5,你需要像
这样的东西var result = DogList.Cast<IAnimal>().Concat(CatList.Cast<IAnimal>());
因为3.5无法自动将collection of something that inherits iAnimal
转换为collection of iAnimal
。
答案 1 :(得分:3)
通用列表来自不同类型(Dog和Cat),您必须在连接之前将它们“强制转换”到目标接口:
var list1 = DogList.Cast<IAnimal>();
var list2 = CatList.Cast<IAnimal>();
var bothLists = list1.Concat(list2); //optional .ToList()