c#如何将结构的引用添加到数组或列表?

Posted

技术标签:

【中文标题】c#如何将结构的引用添加到数组或列表?【英文标题】:c# how to add a reference for a struct to an array or list? 【发布时间】: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
;

我怎样才能做到这一点?

【问题讨论】:

您在寻找“数组初始化”语法(类似于***.com/questions/17322250/…)还是更多bing.com/search?q=c%23+create+array+initialize?请注意,将struct 用于您拥有的数据很奇怪(***.com/questions/521298/when-to-use-struct)并且可能会给您带来很多痛苦... 完全不清楚你在这里真正想要完成什么。除了您的问题只是模糊且过于宽泛之外,谈论 "reference to those structs" 也没有意义——您只能引用引用类型,即类,而不是结构——而且您没有提供任何您实际尝试过的示例,并没有对您在完成时遇到的具体问题做出任何解释。 【参考方案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);
        
    

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

【讨论】:

以上是关于c#如何将结构的引用添加到数组或列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将结构数组从 c++ 传递到 c#?

如何将二维数组从 C# 传递到 C++?

如何通过引用从 c# 到 c++ 传递字节数组

如何在 C# 中删除(或取消)泛型数组列表中的对象? [复制]

当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?

将类添加到列表 C# 时,索引超出了数组的范围