【问题标题】:c# how to add a reference for a struct to an array or list?c#如何将结构的引用添加到数组或列表?
【发布时间】:2018-04-03 06:51:41
【问题描述】:

C# 和面向对象的新手 我正在创建结构中保存的预定义数据(不会改变)。 我想在数组或列表中添加对这些结构的引用 思考过程是然后循环遍历这些结构的数组,如果满足过滤条件,然后将结构“Displayname”的元素添加到列表框 我在这里使用的示例是一个数组

    public struct ListboxData
    {
        public string Category;
        public string Displayname;
        public string ID;
        public List<string> IDTags;
        public string FaultTxt;
        public string Suggestion;
        public string Comments;
        public List<string> MoreQuestions;
    }

    public ListboxData COOLING = new ListboxData
    {
        Category = "CATEGORY",
        Displayname = "COOLING",
        ID = "CAT_COOL",
        IDTags = { ""},
        FaultTxt = "",
        Suggestion = "",
        Comments = "",
        MoreQuestions = { ""}
    };

现在已经创建了 ListboxData 结构的多个实例,然后我想将其中一些结构的选择添加到数组中。在这种情况下,结构引用 COOLING

我正在努力实现的示例

public ListboxData[] ARRAYofCATEGORIES =
{
    COOLING
};

我怎样才能做到这一点?

【问题讨论】:

标签: c# arrays list struct reference


【解决方案1】:

我重写了你的例子,工作正常。可以找现场测试here

下面是代码。我使用了 List() ,因为您在问题中提到它是可以接受的,而且我更习惯了。

我不知道你做错了什么,因为你没有向我们展示一个完整的例子。您可以阅读下面的代码,告诉我是否有您不理解/不想要的东西,我会更新我的答案以满足您的需求:-)

这里是代码

公共结构列表框数据 { 私有只读字符串_category;

    private readonly string _displayname;
    private readonly string _id;
    private readonly List<string> _idTags;
    private readonly string _faultTxt;
    private readonly string _suggestion;
    private readonly string _comments;
    private readonly List<string> _moreQuestions;

    public ListboxData(string category, string displayname, string id, List<string> idTags, string faultTxt, string suggestion, string comments, List<string> moreQuestions)
    {
        _category = category;
        _displayname = displayname;
        _id = id;
        _idTags = idTags;
        _faultTxt = faultTxt;
        _suggestion = suggestion;
        _comments = comments;
        _moreQuestions = moreQuestions;
    }

    public string Category
    {
        get { return _category; }
    }

    public string Displayname
    {
        get { return _displayname; }
    }


    public string Id
    {
        get { return _id; }
    }


    public List<string> IdTags
    {
        get { return _idTags; }
    }


    public string FaultTxt
    {
        get { return _faultTxt; }
    }


    public string Suggestion
    {
        get { return _suggestion; }
    }


    public string Comments
    {
        get { return _comments; }
    }


    public List<string> MoreQuestions
    {
        get { return _moreQuestions; }
    }
}

public class Test
{
    public List<ListboxData> Categories = new List<ListboxData>();
    public CoolingListTest()
    {            
        Categories.Add(new ListboxData(
            category: "CATEGORY",
            displayname: "COOLING",
            id: "CAT_COOL",
            idTags: new List<String> { "" },
            faultTxt: "",
            suggestion: "",
            comments: "",
            moreQuestions: new List<String> { "" }
         ));
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var test = new Test(); 

        Console.WriteLine(test.Categories.First().Displayname);
    }
}

【讨论】:

  • 可变结构是邪恶的。
  • 感谢您教导可变结构的邪恶。我学会了,并更新了我的答案。它现在应该不那么邪恶了。如果您不介意再看一下,我将不胜感激:-)
  • 现在我明白了一点,感谢返工。我试图以这样一种方式编写它,即各个结构以及其中的很多结构比您刚刚发布的示例更易于阅读。我希望将构造引用添加到列表中,例如
  • 也许您应该使用数据库来存储这些数据?或者也许是一个文件?将其直接存储在代码中有点奇怪:-) 如果您的问题得到解答,您可以单击绿色的小“勾号”,以便其他人知道他们的问题是相似的,可以在此处找到答案。如果您关心的话,这也会给您和回答者一些声誉:-)
  • 现在我明白了一点,感谢返工。非常感谢您的宝贵时间
【解决方案2】:

要遵循的第一条规则是您必须将不变性设计为struct。特别是如果字段是引用类型(字符串、数组、用户类)。

我将在下面演示一个简化的示例,该示例使用各种值填充结构,然后创建结构的集合(数组或列表),最后将其中一个值切片为数组。

查看live code here此代码:

public struct ListboxData
{        
    public ListboxData(
        int id,
        string category,
        string name,
        params string[] tags) : this()
    {
        this.ID = id;
        this.Category = category;
        this.Name = name;
        this.Tags = new List<string>();
        this.Tags.AddRange(tags);
    }      
    public int ID { get; private set; }
    public string Category { get;  private set;}
    public string Name { get;  private set;}
    public List<string> Tags { get;  private set;}

    public string[] ToStringArray() 
    {
        return new[] {
            ID.ToString(),
            Category,
            Name,
            string.Join(";", Tags)
        };
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        //Your code goes here
        Console.WriteLine("Hello, world!");

        var list = new List<ListboxData>();
        list.Add(new ListboxData(1001, "COOLING", "Cooling Intro"));
        list.Add(new ListboxData(1002, "COOLING", "Cooling Adanced"));
        list.Add(new ListboxData(1003, "COOLING", "Cooling Tests"));
        list.Add(new ListboxData(1004, "HEATING", "Heating Intro", "tag1", "tag2"));

        // Get all cooling ID's
        int[] ids = list.Where((item)=> item.Category=="COOLING").Select( (item)=> item.ID).ToArray();
        // { 1001, 1002, 1003 }

        foreach(var item in ids)
        {
            Console.WriteLine(item);
        }

        // Get all items that contain "Intro" in the name
        ListboxData[] intro = list.Where((item)=>item.Name.Contains("Intro")).ToArray();
        // { list[0], list[3] }
        foreach(var item in intro)
        {
            Console.WriteLine(item.Name);
        }
    }
}

的较新版本对上述代码进行了简化。您可以省略属性中的private set; 语句。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多