我有几个展示继承结构的类:
public class BaseClass
{
Guid ID {get;set;}
}
public class LeafType : BaseClass{ /* omitted */}
public class OtherLeafType : BaseClass{ /* omitted */}
public class Node : BaseClass
{
public List<LeafType> FirstLeaves {get;set;}
public List<OtherLeafType > SecondLeaves {get;set;}
public ???? AllLeaves {get;} //Returns all items in both FirstLeaves and SecondLeaves
}
在上面的示例中,Node
有两个集合,其元素派生自BaseClass
。 .Net有一个可以组合这两个集合的集合,并在FirstLeaves
或SecondLeaves
更改时自动更新吗?我找到了类System.Windows.Data.CompositeCollection,但它在PresentationFramework中,对我来说这表示它是用于UI目的。我的班级Node
生活在与UI无关的程序集中,因此CompositeCollection
看起来不合适。还有其他课程可以达到类似目的吗?
更新1:看看到目前为止的答案,似乎我的问题没有明确表达:CompositeCollection
Enables multiple collections and items to be displayed as a single list,但我想知道.Net框架是否提供了类似功能的类型与GUI无关。如果没有,那么我将推出自己的解决方案,这看起来非常像@Erik Madsen的答案
答案 0 :(得分:1)
我建议使用迭代器。它不是一个集合,但可以通过Linq的ToList()扩展方法转换为集合。
迭代器提供集合内容的实时视图。如果在迭代IEnumerable时底层集合发生了变化,您将需要测试会发生什么。但通常这被认为是不好的做法。
public IEnumerable<BaseClass> AllLeaves
{
get
{
foreach (LeafType firstLeaf in FirstLeaves)
{
yield return firstLeaf;
}
foreach (OtherLeafType secondLeaf in SecondLeaves)
{
yield return secondLeaf;
}
}
}
public List<BaseClass> AllLeavesList()
{
return AllLeaves.ToList();
}
答案 1 :(得分:0)
我认为将一个列表连接到另一个列表可能不适用于您的情况,因为它们被声明为不同的类(即使它们继承了Base
类)。我会返回一个新的合并列表。
public List<BaseClass> AllLeaves
{
get
{
List<BaseClass> l = new List<BaseClass>();
l.AddRange(FirstLeaves);
l.AddRange(SecondLeaves);
return l;
}
}