【问题标题】:How to create an array of custom type in C#?如何在 C# 中创建自定义类型的数组?
【发布时间】:2011-10-09 16:48:58
【问题描述】:

我创建了一个对象数组,其中包含不同类型的元素:

public static int a;
public static string b;
public static ushort c;

object[] myobj = new obj[]{ a, b, c};

如果我想创建一个包含 myobj 类型数组元素的数组,我该怎么做?

我的意思是这样的:

myobj[] myarray = new myobj[];  <= but to do this, myobj should be a type. 

不知道怎么解决。

谢谢大家。

【问题讨论】:

    标签: c# arrays types


    【解决方案1】:

    创建一个包含您想要的类型的类型,并创建一个数组。

    public class MyType // can be a struct. Depends on usage.
    {
      // should really use properties, I know, 
      // and these should probably not be static
      public static int a;
      public static string b;
      public static ushort c;
    }
    
    // elsewhere
    MyType[] myobj = new MyType[]{};
    

    不知道为什么你会想用object[] 跳过篮球并且不得不到处施法。

    【讨论】:

    • 你在几分之一秒内击败了我 ;) +1
    • 我猜这个成员不应该是静态的:)
    • @Yiğit Yener - 同意,但我已从 OP 获取代码,也许这是故意的......
    • 是的,这是一个不错的方法。我已经在 StackOverflow 中讨论过,发现无法像数组一样访问类的字段。我在这里给出的是它的简短形式。上一次讨论的人建议使用数组,以便可以使用索引访问类的字段。
    【解决方案2】:

    我们使用Dictionary 来存储您需要的任何类型怎么样?

    因此,虽然您不会完全拥有 myType.a,但您可以拥有 myType.Values["a"],它足够接近,利用标准 C# 构造,并为您提供了很大的灵活性/可维护性

    public class MyType
    {
        public MyType()
        {
            this.Values = new Dictionary<object, object>();
        }
    
        public Dictionary<object, object> Values
        {
            get;
            set;
        }
    }
    

    及示例用法:

    using System;
    using System.Collections.Generic;
    
    public static class Program
    {
        [STAThread]
        private static void Main()
        {
            var myTypes = new MyType[3];
    
            myTypes[0] = new MyType();
            myTypes[1] = new MyType();
            myTypes[2] = new MyType();
    
            for (var current = 0; current < myTypes.Length; ++current)
            {
                // here you customize what goes where
                myTypes[current].Values.Add("a", current);
                myTypes[current].Values.Add("b", "myBvalue");
                myTypes[current].Values.Add("c", (ushort)current);
            }
    
            foreach (var current in myTypes)
            {
                Console.WriteLine(
                   string.Format("A={0}, B={1}, C={2}", 
                                  current.Values["a"], 
                                  current.Values["b"],
                                  current.Values["c"]));
            }
    
     }
    

    另外,如果需要,您可以轻松地将indexer 属性添加到您的类中,这样您就可以使用语法myType["a"] 访问元素。请注意,您应该在添加或检索值时添加错误检查。

    public object this[object index]
    {
        get
        {
            return this.Values[index];
        }
    
        set
        {                    
            this.Values[index] = value;
        }
    }
    

    这是一个使用索引器的示例。将条目增加“1”,以便我们看到输出的差异:

    for (var current = 0; current < myTypes.Length; ++current)
    {
        myTypes[current]["a"] = current + 1;
        myTypes[current]["b"] = "myBvalue2";
        myTypes[current]["c"] = (ushort)(current + 1);
    }
    
    foreach (var current in myTypes)
    {
        Console.WriteLine(string.Format("A={0}, B={1}, C={2}", 
                                        current["a"], 
                                        current["b"], 
                                        current["c"]));
    }
    

    【讨论】:

    • 哇,非常感谢。让我尝试一下,如果它在我的工作中会回复,但通过查看它肯定会工作。感谢您的大力帮助。非常感激。将很快尝试并标记为答案。 :)
    • 没问题。添加了索引器。希望对您有所帮助。
    • 再次感谢。我使用了这个,但做了一些修改以适应确切的要求。非常感谢! :)
    • 我也试过用 list 做这个,得到了另一个答案,只是让你知道。 stackoverflow.com/questions/6777699/….
    • 很高兴它成功了。至于List,虽然提供的解决方案对这个问题很有帮助,但我一想到这样做就感到不寒而栗:)
    【解决方案3】:

    我做了一些更改,但我认为这符合您想要做的精神。

    由于属性是数组元素的唯一区别特征,“静态”没有意义,因此我将其删除。

    如果你定义类如下:

        public class MyType
        {
            /// <summary>
            /// Need a constructor since we're using properties
            /// </summary>
            public MyType()
            {
                this.A = new int();
                this.B = string.Empty;
                this.C = new ushort();
            }
    
            public int A
            {
                get;
                set;
            }
    
            public string B
            {
                get;
                set;
            }
    
            public ushort C
            {
                get;
                set;
            }
        }
    

    你可以这样使用它:

    using System;
    
    public static class Program
    {
        [STAThread]
        private static void Main()
        {
            var myType = new MyType[3];
    
            myType[0] = new MyType();
            myType[1] = new MyType();
            myType[2] = new MyType();
    
            for (var i = 0; i < myType.Length; ++i)
            {
                myType[i].A = 0;
                myType[i].B = "1";
                myType[i].C = 2;
            }
    
            // alternatively, use foreach
            foreach (var item in myType)
            {
                item.A = 0;
                item.B = "1";
                item.C = 2;
            }
        }
    }
    

    【讨论】:

    • 感谢古斯塔沃。但我需要的一件事是需要使用索引访问 MYTYPE 的 A、B 和 C 字段。我不会用 myType.A 之类的名称来代替 myType[A] 并访问类型为 MYType 的实例的 A。
    • 非常感谢您花时间编写代码的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多