【问题标题】:C#: Add objects into List<T> class dynamically [closed]C#:动态地将对象添加到 List<T> 类中[关闭]
【发布时间】:2013-04-16 06:43:26
【问题描述】:

我想将我的所有对象动态添加到列表中,而无需任何硬编码。

代码:

static void Main(string[] args)
    {
        Item objA = new Item();
        Item objB = new Item();
        int count = Item.getCount();// count = 2

        List<Item> cont1 = new List<Item>();
        while (count > 0)
        {
            for (int i = 0; i < count; i++)
            {
                cont1.Add();
                //I missing an instance to get the objA and objB into cont1
                //I dont want hard code it, e.g: cont1.Add(objA).
            }

        }
   }

【问题讨论】:

  • 删除两行Item objX = new Item();', remove WHILE loop completely, leave just FOR loop and change the FOR's body to cont1.Add(new Item());`
  • @SonerGönül:他不想这样做可能是因为它会添加同一个对象 N 次,而 "objA, objB" 表明他想要几个不同的对象
  • 不太明白这个问题...您想要的动态列表中的对象在哪里?
  • 意思是,如果是静态的并且如果我有 objA、objB、objC 直到 objZ,我必须输入 cont1.Add(objA) 直到 cont1.Add(objZ)...我想使用 for 循环将它们添加到 list 中,而无需对其进行硬编码。顺便说一句,我的问题让你们感到困惑吗?为什么这么多 - 我的问题投票?
  • 因为您的问题非常混乱,虽然我们可以猜测您的想法 - 我们不应该这样做。您的问题中有很多模糊的小细节。例如:您写了“Main(){ Item objA=new Item() ..}”,现在您说“静态”。您的代码示例中的“objA、objB”变量不是静态的。他们是本地人。或者,您有“new Item()、new Item()”和带有注释“//count==2”的“Item.getCount()”。这种方法实际上是什么以及如何计算?我们可以猜测,但你应该说出来。然后,在 For 循环中,您有注释:“要获取的实例” - 我们可以再次猜测..

标签: c# list


【解决方案1】:

根据您的评论:

如果您多次创建 'static Item objA = new Item()',最终得到:

static Item objA = new Item();
static Item objB = new Item();
....
static Item objZ = new Item();

然后将它们全部放入一个列表中,您几乎别无他法:

list = new List<Item>;
list.Add(objA);
list.Add(objB);
...
list.Add(objZ);

这是因为您已经创建了项目,并且已经将它们放入了几十个不同的变量中,并且要将它们放入列表中,您只需告诉编译器它应该从哪里获取它们 .这意味着,您必须告诉他从 objA 变量、从 objB 变量和 (...) 等中获取它。这是因为您将它们放在不同的变量中。

关键是你一开始就选择了错误的方式。首先,您不应该创建“objA、objB、objC、....、objZ”。它应该是一个列表或数组或字典或任何集合,以便您可以轻松地一次访问所有项目。不应将它们放入单独的变量中。

如果可以,请不要创建可能的变量。例如,使用字典:

Dictionary<string, Item> items = new Dictionary<string, Item>();
items["A"] = new Item();
items["B"] = new Item();
...
items["Z"] = new Item();

现在,您可以轻松获得一个项目:

items["F"].Something = 321;
items["O"].Something = 123;

您还可以轻松访问所有项目

var number = items.Values.Count;

itemList = new List<Item>( items.Values );

当然,有时您只是没有这样的选择。例如,WinForms Designer 会为您创建变量,如果您在表单上放置 100 个标签,您几乎总是会拥有 100 个变量(尽管不是静态的)。

尽管如此,所有这些变量都属于某个类。如果您的项目设置允许您使用反射,那么您可以检查该类并获取名称/属性列表,并且您可以读取它们的值:

class X
{
    public static Item objA = new Item();
    ..., objB, objC, ..... ,.....,
}

...

List<Item> items = new List<Item>();
foreach (var field in typeof(ListaUczniow).GetFields(BindingFlags.Static | BindingFlags.Public))
    if (field.Name.StartsWith("obj") && field.FieldType == typeof(Item))
        items.Add( (Item) field.GetValue(null) );

这可能对您有用,但总的来说,这是一种非常脆弱的方法:您必须注意正确的 BindingFlags、正确的字段名称、正确的字段类型,并且编译器无法自动检查对 Item 的强制转换,甚至有些如果您在 Silverlight 上编写,并且您的字段是私有的,则可能会出现安全问题。

【讨论】:

  • 好的,明白了。非常感谢。
【解决方案2】:
int count = Item.getCount();// count = 2

在我看来,当调用构造函数并且您想访问循环中此类的每个实例时,您的 Item 类“在后台”增加了一个计数器?

如果是这样,您最好的选择似乎是将 List 作为(私有)静态属性直接添加到 Item 类本身,并让构造函数 Add(this) 到此列表。然后可以通过静态ReadOnlyCollection&lt;Item&gt; 集合来公开它。

【讨论】:

  • +1:确实!两次“新项目”和评论“//getCount==2”确实表明作者隐藏了一些类似存储库的模式。但是,我想知道,它目前是不是有点太先进了?两个循环和“添加”问题看起来像是很早的尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2012-01-12
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多