代码之家  ›  专栏  ›  技术社区  ›  Jasmeet

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

  •  0
  • Jasmeet  · 技术社区  · 6 年前

    我有一个类似下面的课

    class OuterClass
    {
        public InnerClass InnerObject{get;set;}
        ////Some more properties and methods
    }
    

    现在在另一节课上,我有两张单子,其中一张 OuterClass 对象和 InnerClass 物体。我想要一份 内层 要从属性填充的对象 InnerObject 对象中的 外级 名单。 我可以通过迭代 外级 列出并填充 内层 名单。但是,这需要随时注意。 外级 列表已修改。

    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() 必要时一定要打电话。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Dmitry Egorov    6 年前

    示例代码建议 InnerClassList 应该只反映 OuterClassList 不能独立维护。如果是这样,您可以即时构建内部列表:

    private List<InnerClass> InnerClassList => OuterClassList.Select(x => x.InnerObject).ToList();
    

    如果 内部类列表 的使用模式仅限于对其进行迭代,您可以将其类型更改为 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
    }
    

    注:我还更改了 外级表 以确保它始终被实例化。如果它是私有属性,那么一旦初始化了对象,就将其更改为只读属性不会中断 AnotherClass 并使内部操作更容易。

        2
  •  1
  •   Stone    6 年前

    试着看看它是否满足你的需要。

    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);
            }
        }
    }
    
        3
  •  1
  •   CodeMan    6 年前

    我想你不需要内循环列表,看这个:

    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());
    }
    
    推荐文章