gpt4 book ai didi

c# - 公共(public)属性 List 需要 Concat 2 types with inheritance

转载 作者:行者123 更新时间:2023-11-30 17:22:56 32 4
gpt4 key购买 nike

我有 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?
}

最佳答案

如果这些是通用列表,像这样:

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() .

至于属性 setter ——我不建议让这个属性包含属性 setter 。这将以非常不标准的方式运行。相反,制作一个自定义方法来处理列表设置很可能是一个更好的主意。

如果您要传递一个列表,其中包含 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 设置这些数组更有效,因为您将需要一些奇怪的过滤。

关于c# - 公共(public)属性 List 需要 Concat 2 types with inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493883/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com