我有两个列表:一个是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?
}
答案 0 :(得分:2)
如果这些是通用列表,请执行以下操作:
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设置这些数组更有效,因为您将需要一些奇怪的过滤。
答案 1 :(得分:0)
此外,由于协方差,它将在.net 4.0中无需强制转换