5

当前的这个项目更像是一个更大项目的概念证明。我有两个“表”(表示为下面的列表),CatList并且DogList,它们具有相同的列结构。我希望能够ConcatUnion两者并使用对结果集执行查询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 语句中需要更改的内容。

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>'
4

2 回答 2

13

问题是编译器无法通过连接 aList<Dog>和 a来确定List<Cat>它应该生成iAnimals 的集合。默认情况下,它会看到 aList<Dog>并期望以下集合也是 of 的集合Dog

iAnimal您可以通过向 提供通用参数来明确告诉将所有内容视为this Concat,即

var result = DogList.Concat<iAnimal>(CatList);

然后你会得到一个resulttype IEnumerable<iAnimal>

编辑:如果你被困在 .NET 3.5 上,你需要类似的东西

var result = DogList.Cast<IAnimal>().Concat(CatList.Cast<IAnimal>());

由于 3.5 无法自动转换collection of something that inherits iAnimalcollection of iAnimal.

于 2013-01-08T16:49:13.973 回答
3

通用列表来自不同的类型(狗和猫),您必须在连接之前将它们“转换”到目标接口:

var list1 = DogList.Cast<IAnimal>();
var list2 = CatList.Cast<IAnimal>();

var bothLists = list1.Concat(list2); //optional .ToList()
于 2013-01-08T16:48:32.957 回答