C# 如何将实现公共接口的集合添加到一起

C# 如何将实现公共接口的集合添加到一起,c#,inheritance,collections,interface,C#,Inheritance,Collections,Interface,我的课程设置如下。 因此,这两个集合都实现了一个公共接口-IChild 有没有办法让父对象上的方法返回每个集合的公共部分 我在下面使用“+”,我知道这不起作用,但它表明了我正在尝试做什么 public interface IChild { DateTime Date { get; } Parent Parent { get; set; } } public class Boy : IChild { public virtual Parent Parent { get;

我的课程设置如下。 因此,这两个集合都实现了一个公共接口-IChild

有没有办法让父对象上的方法返回每个集合的公共部分

我在下面使用“+”,我知道这不起作用,但它表明了我正在尝试做什么

public interface IChild
{
    DateTime Date { get; }
    Parent Parent { get; set; }
}

public class Boy : IChild
{
    public virtual Parent Parent { get; set; }
    public virtual DateTime GraduationDate { get; set; }
    public virtual DateTime Date { get { return ProcedureDate; } }
}

public class Girl : IChild
{
    public virtual Parent Parent { get; set; }
    public virtual DateTime WeddingDate { get; set; }
    public virtual DateTime Date { get { return ContactDate; } }
}


public Parent
{
    protected IList<Boy> _boys = new List<Boy>();
    protected IList<Girl> _girls = new List<Girl>();

    public virtual IEnumerable<Boy> Boys
    {
        get { return _boys; }
    }

    public virtual IEnumerable<Girl> Girls
    {
        get { return _girls; }
    }

    public virtual IEnumerable<IChild> Children
    {
        get
        {
            return _boys + _girls;
        }
    }
}
公共接口IChild
{
日期时间日期{get;}
父{get;set;}
}
公共班男生:IChild
{
公共虚拟父级{get;set;}
公共虚拟日期时间刻度日期{get;set;}
公共虚拟日期时间日期{get{return ProcedureDate;}}
}
公共班级女生:IChild
{
公共虚拟父级{get;set;}
公共虚拟日期时间婚礼日期{get;set;}
公共虚拟日期时间日期{get{return ContactDate;}}
}
公共家长
{
受保护的IList_boys=新列表();
受保护的IList_girls=新列表();
公共虚拟数字男孩
{
得到{返回_boys;}
}
公共虚拟数字女孩
{
得到{return_girls;}
}
公共虚拟可数子对象
{
收到
{
返回男孩+女孩;
}
}
}

谢谢

您是否只想在结果集合中使用公共元素


可以考虑重载+运算符< /P> < P>是否只在结果集合中使用公共元素? 可以考虑重载+运算符< /p> ,可以使用<代码> Case<代码>转换为接口,然后<代码> CONTAG/CODE >流一个接一个。< /P>

return _boys.Cast<IChild>().Concat(_girls.Cast<IChild>()); // .NET 3.5 and greater
return _boys.Cast().Concat(_girls.Cast());/。净额3.5及以上
注意:如果您使用的是.NET3.5,则需要执行此处所示的强制转换。如果您在.NET 4上,您可以使用并省略cast来代替
.Concat
,这是因为它们在.NET 4版本中使
IEnumerable
协变,从而允许在方法调用
IEnumerable
时替换
IEnumerable

return _boys.Concat(_girls);/。NET 4.0及更高版本
最后,如果您仍然使用.NET2.0,这两种方法都不适用,尽管自己实现起来很简单

public virtual IEnumerable<IChild> Children // .NET 2.0 and greater
{
    get
    {
        foreach (IChild boy in _boys)
            yield return boy;
        foreach (IChild girl in _girls)
            yield return girl;
    }
}
public virtual IEnumerable Children//.NET 2.0及更高版本
{
收到
{
foreach(一年级男生)
退换货男孩;
foreach(第一个女孩)
回归女孩;
}
}
您可以使用
Cast
对界面进行强制转换,然后使用
Concat
依次对一个序列进行流式处理

return _boys.Cast<IChild>().Concat(_girls.Cast<IChild>()); // .NET 3.5 and greater
return _boys.Cast().Concat(_girls.Cast());/。净额3.5及以上
注意:如果您使用的是.NET3.5,则需要执行此处所示的强制转换。如果您在.NET 4上,您可以使用并省略cast来代替
.Concat
,这是因为它们在.NET 4版本中使
IEnumerable
协变,从而允许在方法调用
IEnumerable
时替换
IEnumerable

return _boys.Concat(_girls);/。NET 4.0及更高版本
最后,如果您仍然使用.NET2.0,这两种方法都不适用,尽管自己实现起来很简单

public virtual IEnumerable<IChild> Children // .NET 2.0 and greater
{
    get
    {
        foreach (IChild boy in _boys)
            yield return boy;
        foreach (IChild girl in _girls)
            yield return girl;
    }
}
public virtual IEnumerable Children//.NET 2.0及更高版本
{
收到
{
foreach(一年级男生)
退换货男孩;
foreach(第一个女孩)
回归女孩;
}
}
公共虚拟IEnumerable子项
{
收到
{
return _boys.Concat(_girls);
}
}
公共虚拟IEnumerable子项
{
收到
{
return _boys.Concat(_girls);
}
}
公共虚拟IEnumerable子项
{ 
收到
{ 
列表=新列表();
列表。AddRange(男孩);
列表。AddRange(女孩);
退货清单;
} 
} 
公共虚拟IEnumerable子项
{ 
收到
{ 
列表=新列表();
列表。AddRange(男孩);
列表。AddRange(女孩);
退货清单;
} 
} 

作为@Anthony Pegram,你需要施展他们。将“IList”误读为“List”。事实上,如果你在.NET4上,你的答案是有效的。如果您使用的是3.5,您需要调用
Cast
。啊,不知道他们已经改变了。每天学习新的东西。作为@Anthony Pegram,你需要施展他们。将“IList”误读为“List”。事实上,如果你在.NET4上,你的答案是有效的。如果您使用的是3.5,您需要调用
Cast
。啊,不知道他们已经改变了。每天学习新的东西。
public virtual IEnumerable<IChild> Children 
    { 
        get 
        { 
          List<IChild> list = new List<IChild>();
          list.AddRange(Boys);
          list.AddRange(Girls);  
          return list; 
        } 
    }