Открытое свойство List должно содержать Concat 2 типа с наследованием

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

List<a> listA = new List</a><a>();
List<aa> listAa = new List<aa>();
</aa></aa></a>

с

class Aa : A

У меня есть:

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

Можно ли каким-то образом использовать 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 ответа

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

List<a> listA;
List<aa> listAa;
</aa></a>

Вы должны уметь:

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

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

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

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

<a><code>public void SetLists(IEnumerable</code></a><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);
 }
}
</a>

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


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

licensed under cc by-sa 3.0 with attribution.