如何从外部列表中获取内部成员列表?

时间:2019-01-02 04:54:17

标签: c# .net list

我有一个类似于下面的类

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
 }

还有其他方法可以确保InnerClassListOuterClassList正确同步,而不必进行迭代和填充,还可以确保确实调用了方法PopulateInnerClassList()必要时。

3 个答案:

答案 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并使内部操作更加容易。