Публичное свойство List необходимо для Concat 2 типов с наследованием - PullRequest
3 голосов
/ 22 марта 2010

У меня есть 2 списка: один типа A и один типа Aa. тип Aa наследуется от типа A. Итак:

List<A> listA = new List<A>();
List<Aa> listAa = new List<Aa>();

с

class Aa : A

У меня есть:

public property Lists<A>
{
  get
   {
    List<A> newList = new List<A>();
    //return concat of both lists
    foreach(List l in listA)
    {
      newList.Add(l);
    }
    foreach(List l in listAa)
    {
      newList.Add(l);
    }
}

Могу ли я как-то использовать Concat вместо цикла foreach? то есть

get
{
  return listA.Concat(listAa);
} // this doesn't work

А во-вторых, как мне сделать заданную часть свойства?

set
{
  //figure out the type of variable value and put into appropriate list?
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Если это общие списки, например:

List<A> listA;
List<Aa> listAa;

Вы должны быть в состоянии сделать:

public IList<A> Lists
{
    get 
    {
        return listA.Concat(listB.Cast<A>()).ToList();
    }
}

Вызов Enumerable.Cast позволит вам преобразовать List<Aa> в IEnumerable<A> (поскольку Aa является подклассом A), что заставит Concat работать. Затем вы можете преобразовать это обратно в List<A>, вызвав ToList().

Что касается установщика свойств - я не рекомендовал бы, чтобы это свойство содержало установщик свойств. Это будет вести себя ОЧЕНЬ нестандартным образом. Вместо этого, скорее всего, было бы гораздо лучше создать собственный метод для обработки настроек списков.

Если вы собираетесь передать один список, содержащий классы Aa и A, вы можете использовать что-то вроде:

public void SetLists(IEnumerable<A> newElements)
{
    this.listA.Clear();
    this.listAa.Clear();
    foreach(A aElem in newElements)
    {
        Aa aaElem = aElem as Aa;
        if (aaElem != null)
            this.listAa.Add(aaElem);
        else
            this.listA.Add(aElem);
    }
}

В этом случае выполнение цикла на самом деле будет более эффективным, чем попытка использовать LINQ для установки этих массивов, поскольку вам потребуется некоторая нечетная фильтрация.

0 голосов
/ 22 марта 2010

также он будет работать в .net 4.0 без приведения из-за ковариации

...