不能加入父母同一集合下的 2 个后代
本文关键字:后代 集合 父母 不能 | 更新日期: 2023-09-27 18:24:14
这是我的类结构:
public class MainWindow
{
public List<FirstBar> FirstBars { get; set; }
public List<Foo> SelectedFoos { get; set; }
public MainWindow()
{
FirstBars = new List<FirstBar>();
SelectedFoos = new List<Foo>();
}
}
public abstract class Foo { public bool IsSelected { get; set; } }
public class FirstBar : Foo { public List<SecondBar> SecondBar { get; set; } }
public class SecondBar : Foo { }
。然后我想在这种情况下/填写SelectedFoos
:
我想找到所有
IsSelected==true
FirstBar
。如果我 找到一个IsSelected==false
FirstBar
,然后我寻找每个SecondBar
FirstBar
IsSelected==true
.
因此,基于该条件,我在MainWindow
的构造函数中集合初始化后的某个地方写下了这个:
/*assume below collections are already filled with some items.*/
SelectedFoos = FirstBars.Where(x => x.IsSelected).ToList(); //this is the error, below code is kinda irrelevant.
SelectedFoos.AddRange(FirstBars.Where(x => !x.IsSelected).SelectMany(x => x.SecondBars).Where(x => x.IsSelected).ToList();
但是,编辑说这是错误的/错误:
无法将类型
'...FirstBar>'
隐式转换为'...Foo>'
然后,我尝试:
/*assume below collections are already filled with some items.*/
SelectedFoos = (List<Foo>)FirstBars.Where(x => x.IsSelected).ToList(); //this is the error, below code is kinda irrelevant.
SelectedFoos.AddRange((List<Foo>)FirstBars.Where(x => !x.IsSelected).SelectMany(x => x.SecondBars).Where(x => x.IsSelected).ToList();
之后,错误更改为:
无法将类型
'...FirstBar>'
转换为'...Foo>'
我的推理是(这显然是错误的(,因为它们(FirstBar
和SecondBar
(都有相同的父级(Foo
(,那么它们可以组合在它们的父级(List<Foo>
(列表中。
顺便说一句,我知道如果我将它们拆分为不同的集合可以解决,但最好有 1 个列表(因为在我的实际项目代码中,还有 ThirdBar
(它的集合在 SecondBar
内(和FourthBar
(这个集合在ThirdBar
内(。
谁能解释一下是什么原因造成的?我觉得我对这个问题的一些基本的继承有点迷茫。
谢谢
这里的父母无关(无论如何你都没有加入( - 它甚至不在你的第二行。问题只是List<FirstBar>
不是List<Foo>
,即使每个FirstBar
都是Foo
。从 .NET 4 开始,使用泛型协方差很容易解决此问题:
SelectedFoos = FirstBars.Where(x => x.IsSelected).ToList<Foo>();
ToList
上的显式类型参数意味着这基本上等效于:
IEnumerable<FirstBar> tmp = Enumerable.Where<FirstBar>(FirstBars, x => x.IsSelected);
SelectedFoos = Enumerable.ToList<Foo>(tmp);
这是利用IEnumerable<FirstBar>
表达式可以转换为具有协方差的IEnumerable<Foo>
的事实。