【问题标题】:Struct to an array [closed]结构到数组[关闭]
【发布时间】:2018-04-15 10:44:50
【问题描述】:

正如标题所说,我想要做的是改变这个:

public struct name 
{
   public float var1;
   public float var2;
   public float var3;
}

到一个数组。

如您所见,它们都是浮点类型,我可以使用 var 名称访问它们。我想使用数组做同样的事情。是否可以将这 3 个变量添加到数组中?我的主要目的是对这些变量使用 foreach 迭代,因为在这种情况下我有 9 个变量,所以我想使用数组会更容易..

【问题讨论】:

  • var yourFloats = new[]{i.var1, i.var2, i.var3}; 其中i 是结构name 的一个实例。
  • 那么您将这些值放入数组时遇到了什么问题?
  • @Bips04 如果您想知道如何创建一个具有 3 个可能值的数组,您可以在“如何在 C# 中创建一个数组”进行快速网络搜索,它应该会告诉您如何做到这一点.您在尝试寻找解决方案或使用您找到的任何解决方案时是否遇到任何问题?
  • @Bips04:听起来你想要的实际上是不是一个数组。也许你可以解释你想要做什么,你想要这个东西有什么属性。我认为你说你想要一个数组然后说你想让它做数组不做的事情是在混淆事情。
  • 听起来你需要的是Dictionary<string, float>

标签: c# arrays struct


【解决方案1】:

听起来你想要的是一本字典:

var dictionary = new Dictionary<string, float>();
dictionary.Add("var1", 5);
dictionary.Add("var2", 6);
dictionary.Add("var3", 7);
dictionary.Add("var4", 8);

var value1 = dictionary["var1"]; //5
var value2 = dictionary["var2"]; //6
var value3 = dictionary["var3"]; //7
var value4 = dictionary["var4"]; //8

【讨论】:

    【解决方案2】:

    像这样?

    float[] myArray = new float[3];
    
    myArray[0] = var1;
    myArray[1] = var2;
    myArray[2] = var3;
    
    for (i = 0; i < 3; i++;)
    {
       // do stuff
    }
    

    【讨论】:

    • 可能是,但不是我想要的,我想做的不是复制 var 的值,而是创建一个具有 3 个不同名称的数组,我可以在其中拥有浮点值。
    • 数组使用索引,而不是名称。您在寻找字典之类的东西吗? msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
    【解决方案3】:

    你可以用这个:

    var a = new name();
    a.var1 = 1;
    a.var2 = 2;
    a.var3 = 4;
    var ls = a.GetType().GetFields().Select(x => x.GetValue(a)).ToList();
    

    【讨论】:

      【解决方案4】:

      这就是我如何让我的struct 也作为数组工作。我实现了IEnumerable&lt;float&gt;。例如:

      public struct Vector3 : IEnumerable<float>
      {
          // Remember mutable structs are evil. 
          // Always make fields readonly if possible.
          public readonly float x;
          public readonly float y;
          public readonly float z;
      
          public Vector3(float x, float y, float z)
          {
              this.x = x;
              this.y = y;
              this.z = z;
          }
      
          public IEnumerator<float> GetEnumerator()
          {
              yield return x;
              yield return y;
              yield return z;
          }
      
          IEnumerator IEnumerable.GetEnumerator()
          {
              return GetEnumerator();
          }
      }
      
      class Program
      {
          static void Main(string[] args)
          {
              Vector3 a = new Vector3(2f, -1f, 3f);
              // This uses `Enumerable.ToArray()`
              float[] vals = a.ToArray();
              // This uses `Enumerable.Sum()`
              float sum = a.Sum();
              // This iterates through the values in `a`
              foreach (var item in a)
              {
                  Console.WriteLine(item);
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        一个不同的答案,举个例子:

        [StructLayout(LayoutKind.Explicit)]
        public struct Vertex 
        {
          [FieldOffset(0)]
          public Single X;
          [FieldOffset(4)] // Single uses 4 bytes
          public Single Y;
          [FieldOffset(8)]
          public Single Z;
          [FieldOffset(0)] // This points to the start of the array :)
          public Single[] Position;
        }
        

        此外,您可以使用其他结构,而不是属性:

        [StructLayout(LayoutKind.Explicit)]
        public struct Vertex 
        {
          [FieldOffset(0)]
          public Single X;
          [FieldOffset(4)] // Single uses 4 bytes
          public Single Y;
          [FieldOffset(8)]
          public Single Z;
          [FieldOffset(0)] // This points to the start of the array :)
          public Position Position;
        }
        public stuct Position
        {
          public Single X, Y, Z;
        }
        

        然后以myVertex.Position[0] // X为例

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-05
          • 1970-01-01
          • 2022-01-02
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 2018-12-22
          相关资源
          最近更新 更多