公共属性List需要具有继承的Concat 2类型

时间:2010-03-22 16:20:46

标签: c# linq list ienumerable

我有两个列表:一个是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 个答案:

答案 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()

至于属性设置器 - 我不建议使此属性包含属性设置器。这将以非常非标准的方式表现。相反,最好的做法是制作一个自定义方法来处理设置列表。

如果您要传入包含AaA类的单个列表,则可以使用以下内容:

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中无需强制转换