【问题标题】:How to maintain instance number in list of objects如何在对象列表中维护实例编号
【发布时间】:2015-12-06 12:34:49
【问题描述】:

我有一个类baseClass,以及一个baseClass 的对象列表。我想要实现的是我必须动态地将实例编号分配给列表中的每个对象。为此,我正在做的是使用构造函数来执行此操作。

以下是类定义:

public class baseClass
{
    private int _InstanceNumber;
    private int _MyIntVal;
    private string _MyString;
    public string MyString
    {
        get { return _MyString; }
        set { _MyString = value; }
    }
    public int MyIntVal
    {
        get { return _MyIntVal; }
        set { _MyIntVal = value; }
    }
    public int MyProperty
    {
        get { return _InstanceNumber; }
    }
    public baseClass(int instance)
    {
        _InstanceNumber = instance;
    }
}  

对象列表的创建如下:

int instanceNumber = 0;
List<baseClass> classList = new List<baseClass>();
classList.Add(new baseClass(instanceNumber++) { MyString = "sample1", MyIntVal = 10 });
classList.Add(new baseClass(instanceNumber++) { MyString = "sample2", MyIntVal = 11 });

我知道这不是创建它的实际方法。它实际上并没有给出索引号。如何计算实例数?

考虑以下场景,即创建另一个对象列表,然后很难维护实例编号。或者如果我在列表之外创建另一个对象(这也是一个实例)。

int instanceNumber = 0;
List<baseClass> anotherClassList = new List<baseClass>();
classList.Add(new baseClass(instanceNumber++) { MyString = "sample1", MyIntVal = 10 });
classList.Add(new baseClass(instanceNumber++) { MyString = "sample2", MyIntVal = 11 });

更新: 这是我的临时解决方案。我需要适当的方式/方法来维护实例编号

【问题讨论】:

  • “它实际上并没有给出索引号” - 你是什么意思?顺便说一句,您应该研究自动实现的属性,这可以显着减少您需要编写的代码量——尤其是 C# 6,它支持自动实现的只读属性。我还强烈建议您查看 .NET 命名约定。
  • 接下来,如果您创建一个新列表,您会希望这些实例编号重新从 0 开始吗​​?或者这是一个全局实例编号?
  • 你的代码对我有用...
  • " 它实际上没有给出索引号" 会发生什么?你发现哪个错误?请解释清楚
  • 您可以不存储实例编号,而是通过IndexOf 方法从List&lt;T&gt; 获取它。 var list = new List&lt;BaseClass&gt;(); var a = new BaseClass(); list.Add(a); var b = new BaseClass(); list.Add(b); int numberOfA = list.IndexOf(a);

标签: c# list class object instance


【解决方案1】:

如果你想在列表中找到项目的索引,你应该从list问它,而不是item,比如:

var index = list.IndexOf(item);

但您似乎希望item 了解其在list 中的位置。为此,您应该将list 传递给item,以便它可以使用它在其中找到自己的位置:

public class Item
{
    private List<Item> _containerList;

    public Item(List<Item> containerList)
    {
        _containerList = containerList;
    }

    public int InstanceNumber
    {
        get { return _containerList.IndexOf(this); }
    }
}

并将您的代码更改为:

List<Item> classList = new List<Item>();
classList.Add(new Item(classList ) { ... });
classList.Add(new Item(classList ) { ... });

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 2011-01-07
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多