Как добавить коллекции, которые реализуют общий интерфейс - PullRequest
1 голос
/ 12 октября 2011

Я настроил свои классы, как показано ниже. Таким образом, обе коллекции реализуют общий интерфейс - 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;
        }
    }
}

Спасибо

Ответы [ 4 ]

3 голосов
/ 12 октября 2011
public virtual IEnumerable<IChild> Children
{
    get
    {
        return _boys.Concat<IChild>(_girls);
    }
}
2 голосов
/ 12 октября 2011

Вы можете использовать Cast<T> для приведения к интерфейсу, а затем Concat для потоковой передачи одной последовательности за другой.

return _boys.Cast<IChild>().Concat(_girls.Cast<IChild>()); // .NET 3.5 and greater

Примечание. Если вы используете .NET 3.5, вам необходимо выполнитьактерский состав, как показано здесь.Если вы используете .NET 4, вы можете следовать ответу Кристиана Фенна и опускать приведение вместо .Concat<IChild>, что работает, потому что они сделали IEnumerable<T> ковариантным в выпуске .NET 4, что позволяет1010 * для замены, когда методы вызывают для IEnumerable<IChild>.

return _boys.Concat<IChild>(_girls); // .NET 4.0 and greater

Для завершения, если вы все еще используете .NET 2.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;
    }
}
0 голосов
/ 12 октября 2011
public virtual IEnumerable<IChild> Children 
    { 
        get 
        { 
          List<IChild> list = new List<IChild>();
          list.AddRange(Boys);
          list.AddRange(Girls);  
          return list; 
        } 
    } 
0 голосов
/ 12 октября 2011

хотите ли вы только общие элементы в итоговой коллекции?

можно рассмотреть перегрузку + оператор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...