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# 中删除(或取消)泛型数组列表中的对象? [复制]