我们如何在C#中创建对象列表并通过该对象内的特定字段访问它们?
例如,取这个对象:
class Section
{
public string Name { get; }
public long Size { get; }
public Section(string name, long size)
{
Name = name;
Size = size;
}
}
我想创建一个这些对象的列表,我可以通过Section.Name访问它们。
我可以创建一个字典:
private static readonly Dictionary<string, Section> validSections = new Dictionary<string, Section>
{
{ "section-a", new Section("section-a", 1) },
{ "section-b", new Section("section-b", 2) },
{ "section-c", new Section("section-c", 3) },
{ "section-d", new Section("section-d", 4) },
};
但是如你所见,我必须两次声明部分名称,看起来不够优雅。有更优雅的方式吗?
答案 0 :(得分:2)
但是如你所见,我必须两次声明部分名称 不雅。有更优雅的方式吗?
为避免重复输入,您可以通过ToDictionary
调用
private static readonly Dictionary<string, Section> validSections = new[] {
new Section("section-a", 1),
new Section("section-b", 2),
new Section("section-c", 3),
new Section("section-d", 4)
}.ToDictionary(s => s.Name);
答案 1 :(得分:2)
如果这不是时间关键,那么您可以使用List<Section> list = new ArrayList<Section>();
并将数据存储在其中。
稍后,您可以使用LINQ
根据名称.where(x=>x.Name=="somename")
答案 2 :(得分:1)
首先,您的Model类可以如下所示:
class Section
{
public string Name { get; set; }
public long Size { get; set; }
}
您不需要Name
两次,因此您只需创建一个列表:
private static List<Section> myList = new List<Section>();
myList.add(new Section {Name = "section-a", Size = 1});
// do this for all the sections ...
然后,其他答案建议你可以使用LINQ:
myList.Single(s => s.Name == "section-a");
只需返回名称为“section-a”的单个元素。
在此处阅读有关LINQ的更多信息:https://msdn.microsoft.com/en-us/library/bb308959.aspx
答案 3 :(得分:0)
您可以编写一个获取部分列表并返回相应字典的函数。类似的东西:
public static Dictionary<string, Section> SectionDictionary(List<Section> sections) {
var dict = new Dictionary<string, Section>();
foreach (var section in sections)
dict.Add(section.Name, section);
return dict;
}
答案 4 :(得分:0)
您只需使用LINQ访问元素:
var list = ...;
var el = list.FirstOrDefault(o => o.Name = nameValue);
或者您可以创建一个实现自己的索引器/ getter逻辑的(集合)类。例如。 (伪代码)
public class MyCollection : Collection<Section>
{
public Section this[string nameValue]
{
get
{
return this.FirstOrDefault(o => o.Name == nameValue);
}
}
}
然后用法是:
var coll = new MyCollection() ....;
var el = coll["Some name"];