我有一个类似于下面的类
class OuterClass
{
public InnerClass InnerObject{get;set;}
////Some more properties and methods
}
现在在另一个类中,我有两个列表,一个OuterClass
对象和一个InnerClass
对象。我希望从InnerClass
列表中对象的属性InnerObject
填充OuterClass
对象的列表。
我可以通过遍历OuterClass
列表并填充InnerClass
列表来实现这一点。但是,只要OuterClass
列表被修改,就必须小心。
class AnotherClass
{
private List<OuterClass> OuterClassList{get;set;}
private List<InnerClass> InnerClassList{get;set;}
public void InsertOuterClassObject(OuterClass outerClassObject)
{
this.OuterClassList.Add(outerClassObject);
this.PopulateInnerClassList();
}
private void PopulateInnerClassList()
{
this.InnerClassList = new List<InnerClass>();
foreach(var object in this.OuterClassList)
{
this.InnerClassList.Add(object.InnerObject);
}
}
////More operations to be performed on OuterClassList
}
还有其他方法可以确保InnerClassList
与OuterClassList
正确同步,而不必进行迭代和填充,还可以确保确实调用了方法PopulateInnerClassList()
必要时。
答案 0 :(得分:1)
尝试查看它是否满足您的需求。
public class AnotherClass
{
private List<OuterClass> _OuterClassList;
private List<InnerClass> _InnerClassList;
private List<OuterClass> OuterClassList {
get { return _OuterClassList; }
set
{
_OuterClassList = value;
InnerClassList = value.Select(a => a.InnerObject).ToList();
}
}
private List<InnerClass> InnerClassList { get { return _InnerClassList; } set { InnerClassList = value; } }
public void InsertOuterClassObject(OuterClass outerClassObject)
{
this.OuterClassList.Add(outerClassObject);
this.PopulateInnerClassList();
}
private void PopulateInnerClassList()
{
this.InnerClassList = new List<InnerClass>();
foreach (var item in this.OuterClassList)
{
this.InnerClassList.Add(item.InnerObject);
}
}
}
答案 1 :(得分:1)
我认为您不需要InnerClassList,请看以下内容:
private List<OuterClass> OuterClassList { get; set; }//initialize in constructor.
internal class OuterClass
{
public InnerClass InnerObject { get; set; }
public OuterClass(int num) => InnerObject = new InnerClass(num);
}
internal class InnerClass
{
public int Value { get; set; }
public InnerClass(int num) => Value = num;
}
private void button1_Click(object sender, EventArgs e) => OuterClassList.Add(new OuterClass(new Random().Next(0, 1000)));
private void button4_Click(object sender, EventArgs e)
{
var values = from o in OuterClassList select o.InnerObject.Value;//you always have it, then you don't need InnerClassList I think.
foreach (var value in values)
MessageBox.Show(value.ToString());
}
答案 2 :(得分:1)
该示例代码建议InnerClassList
仅应反映OuterClassList
的状态,而不应独立维护。在这种情况下,您可以动态建立内部列表:
private List<InnerClass> InnerClassList => OuterClassList.Select(x => x.InnerObject).ToList();
如果InnerClassList
的使用模式仅限于遍历它,则可以将其类型更改为IEnumerable<InnerClass>
,从而避免长列表上的性能下降:
private IEnumerable<InnerClass> InnerClassList => OuterClassList.Select(x => x.InnerObject);
因此生成的列表维护代码可能如下所示:
class AnotherClass
{
private List<OuterClass> OuterClassList { get; } = new List<OuterClass>();
private IEnumerable<InnerClass> InnerClassList => OuterClassList.Select(x => x.InnerObject);
public void InsertOuterClassObject(OuterClass outerClassObject)
{
this.OuterClassList.Add(outerClassObject);
}
////More operations to be performed on OuterClassList
}
注意:我还更改了OuterClassList
的定义以确保它总是被实例化。授予它私有属性,将其更改为只读的一次初始化对象就不会破坏AnotherClass
API并使内部操作更加容易。