【问题标题】:Failing To Use Array of Structure in C#未能在 C# 中使用结构数组
【发布时间】:2012-10-12 05:59:29
【问题描述】:

我很抱歉这个奇怪的标题,但我无法弄清楚如何表达它:) 我最近转向 C#,目前我正在研究结构。我基本上是一名 C++ 开发人员,在我的 C++ 代码中我完成了以下操作:

typedef struct 
{
String ChannelName;
bool available;
} Voltage_Channel;

Voltage_Channel *m_voltageChannels;

Voltage_Channel redhookChannels[6] = {
{"", false},
{"VDD_IO_AUD",  true},
{"VDD_CODEC_AUD",true},
{"VDD_DAL_AUD", true},
{"VDD_DPD_AUD",  true},
{"VDD_PLL_AUD", true}   
};

if(m_boardName->compareIgnoreCase("S1010012") == 0) //m_BoardName is string
{   
    m_voltageChannels = redhookChannels;
}

我需要在我的 c# 应用程序中执行此操作。我尝试如下,但有问题:

struct VoltageBoardChannel
    {
        public string ChannelName;
        public bool available;            
    };

VoltageBoardChannel[] mVoltageStruct; 

VoltageBoardChannel[] redhookChannels = new VoltageBoardChannel[6]
    {
        new VoltageBoardChannel() { ChannelName = "", available = false},
        new VoltageBoardChannel() { ChannelName = "VDD_IO_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_CODEC_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_DAL_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_DPD_AUD", available = true},
        new VoltageBoardChannel() { ChannelName = "VDD_PLL_AUD", available = true}            
    };

string redhookboardname = "S1010012";
string redhookboardnameCase = "s1010012";

if (redhookboardnameCase.Equals(redhookboardname, stringComparison.InvariantCultureIgnoreCase))
        {
            mVoltageStruct = redhookChannels;
        }

我在哪里做错了??? :(

【问题讨论】:

  • 您要分配什么 mVoltageStruct ?你想分配数组的第一项redhookChannels 吗?
  • 我想将redhookChannels的所有值赋值给mVoltageStruct
  • @StonedJesus 但这是什么意思?例如:你有一个变量可以容纳一个“人”,以及一个包含 6 个“人”的列表;如何将所有 6 个“人”的值分配给单个“人”变量?在我看来,m_voltageChannels 是指向数组中第一项的指针,但这并不是在复制 anything
  • 嗯 mVoltageStruct 是一个单项结构,而您的 redhookChannels 是一个数组,在您的 C++ 代码中,您将其分配给结构类型的指针,在 C# 中,您定义了另一个数组并制作它的副本。
  • @Habib 你根本没有这样做;正确的下一步很大程度上取决于你想用它做什么,以及你想如何表现。复制数组将显着改变行为,例如,如果我们通过指针更改值,数组内容是否更新?

标签: c# .net wpf arrays struct


【解决方案1】:

mVoltageStruct 是一个单独的值; redhookChannels 是一个数组。您不能将数组分配给值。但是,您可以查看数组内部:

mVoltageStruct = redhookChannels[0]; // copy the item with index 0, zero-based

但是请注意,除非您有特定的理由(P/Invoke 等)来使用 struct,否则您可能想考虑在那里使用一个类。可变结构通常会导致很多混乱。 C# 中的struct 与 C/C++ 中的struct 的含义不同。

还要注意mVoltageStruct = redhookChannels[0];这一行是复制操作;这并不意味着mVoltageStruct 是指向第零项的引用/指针。在 C# 中有种方法可以做到这一点,但如果你使用 class 会容易得多;那么你只会复制参考值。


按 cmets 编辑:

using System;
using System.Collections.Generic;
class VoltageBoardChannel
{
    public string ChannelName { get; set; }
    public bool IsAvailable { get; set; }
}
static class Program {
    static void Main()
    {
        List<VoltageBoardChannel> selectedChannels = null;

        List <VoltageBoardChannel> redhookChannels = new List<VoltageBoardChannel>
        {
            new VoltageBoardChannel { ChannelName = "", IsAvailable = false},
            new VoltageBoardChannel { ChannelName = "VDD_IO_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_CODEC_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_DAL_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_DPD_AUD", IsAvailable = true},
            new VoltageBoardChannel { ChannelName = "VDD_PLL_AUD", IsAvailable = true}            
        };

        string redhookboardname = "S1010012";
        string redhookboardnameCase = "s1010012";

        // string.Equals(a,b,...) rather than a.Equals(b, ...) avoids
        // potential issues when "a" is null
        if (string.Equals(redhookboardnameCase, redhookboardname,
            StringComparison.InvariantCultureIgnoreCase))
        {
            // set selectedChannels to the **same** list:
            selectedChannels = redhookChannels;

            // or if we wanted a filtered list (same VoltageBoardChannel
            // objects, but a different list instance)
            selectedChannels = redhookChannels.FindAll(x => x.IsAvailable);
        }
    }
}

【讨论】:

  • 谢谢 :) 我需要复制 mVoltageStruct 中的所有项目。这怎么可能?
  • @StonedJesus 为什么需要复制所有值?这真的是原始代码的作用吗?你会把它们放在哪里? (您还没有声明第二个数组等)
  • 我需要复制所有频道以显示在我的视图中。稍后我将使用 channelname.available 函数使 true 项目在我的视图中可见:)
  • @StonedJesus 我不同意;由于数组的大小是固定的,所以制作一个 additional 副本根本对您没有帮助;它当然不会帮助您包含/排除特定行。它与原始代码所做/所做的不同。
  • 是的,你是对的。那么理想的做法是什么?你可以发布一个示例代码来演示使用class吗?
【解决方案2】:

您只需将mVoltageStruct 声明为数组,而不是对象:

  VoltageBoardChannel[] mVoltageStruct;

然后你可以分配:

 if (redhookboardnameCase.Equals(redhookboardname, StringComparison.InvariantCultureIgnoreCase))
 {
       mVoltageStruct = redhookChannels;
 }

【讨论】:

  • 迂腐点; mVoltageStruct绝不是“一个对象”;不过,这在常规讨论中可能无关紧要
猜你喜欢
  • 2023-04-03
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多