LINQ中的连接/合并表

本文关键字:合并 连接 LINQ | 更新日期: 2023-09-27 17:50:58

当前这个项目更多的是一个更大项目的概念验证。我有两个"表"(如下表所示),CatListDogList,它们具有相同的列结构。我希望能够使用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>'

LINQ中的连接/合并表

问题是编译器不能弄清楚,通过连接List<Dog>List<Cat>,它应该产生iAnimal s的集合。默认情况下,它看到一个List<Dog>,并期望下面的集合也是Dog的集合。

通过给Concat提供泛型参数,你可以显式地告诉将所有内容都视为iAnimal,即

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

您将得到类型为IEnumerable<iAnimal>result

编辑:如果你被困在。net 3.5上,你需要一些像

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

as 3.5不能自动将collection of something that inherits iAnimal转换为collection of iAnimal .

泛型列表来自不同类型(Dog和Cat),您必须在连接之前将它们"强制转换"到目标接口:

var list1 = DogList.Cast<IAnimal>();
var list2 = CatList.Cast<IAnimal>();
var bothLists = list1.Concat(list2); //optional .ToList()