Linq IEnumerable Concat不适用于包含第二个列表作为子对象的对象列表

时间:2016-03-13 10:20:31

标签: c# linq ienumerable

public class Parent
{
    public int ID { get; set; }
    public List<Child> Children { get; set; }
}

public class Child
{
    public int ID { get; set; }
}

我有

IEnumerable<Parent> parent= items1;
IEnumerable<Child> child= items2;

尝试

parent.Concat(child);

仅返回父实例。我想要父母和孩子的合并列表,天气它是否存在于父层次结构中。

1 个答案:

答案 0 :(得分:0)

你确定吗?我创建了以下类,我的输出产生了预期的项目:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return String.Format("({0}) {1}", this.Id, this.Name);
    }
}

public class Child : Person
{
    public int Grade { get; set; }

    public override string ToString()
    {
        return String.Format("({0}) {1} - {2}", this.Id, this.Name, this.Grade);
    }
}

public static void Main()
{
    IEnumerable<Person> persons = Enumerable.Range(0, 3).Select(i => new Person()
    {
        Id = i,
        Name = "Person " + i.ToString(),
    });
    IEnumerable<Child> children = Enumerable.Range(0, 4).Select(i => new Child()
    {
        Id = i,
        Name = "Child " + i.ToString(),
        Grade = i+6,
    });

    foreach (var x in persons.Concat(children))
    {
        Console.WriteLine(x);
    }
}

运行程序产生了以下输出:

(0)人0 (1)人1 (2)人2 (0)孩子0 - 6
(1)孩子1 - 7
(2)孩子2 - 8
(3)3 - 9岁儿童

请注意,虽然连接包含原始项,因此父项和子项,迭代器只知道Person函数。除非您首先检查它是否是孩子并将其投射给孩子,否则不能调用任何子功能。

如示例程序所示,虚拟函数不需要这样,因为虚函数是Person函数。调用实际对象的实现:当它是Child时,调用子函数。这是虚函数的正常行为。