定义对象列表。获取对象中的特定字段

问题描述:

我们如何在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

为什么不使用LINQ,并选择其中(S => s.Name ==名称)? –

但正如你看到的,我必须声明段名两次,这看起来 不雅。有没有更优雅的方式?

为了避免repetitve字,就可以通过电话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

美丽。谢谢! – arminb

您可以编写一个函数,该函数接受一个节的列表并返回相应的字典。喜欢的东西:

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; 
} 
+0

或者使用内置的Linq'ToDictionary'方法... –

如果不是时间关键那么您可以在使用它List<Section> list = new ArrayList<Section>();和存储数据。
后来你可以使用LINQ根据名称来查询.where(x=>x.Name=="somename")

可以使用LINQ刚刚访问元素:

var list = ...; 
var el = list.FirstOrDefault(o => o.Name = nameValue); 

或者你可以创建一个(集合)类,它实现你自己的索引/吸气逻辑。例如。 (伪)

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"]; 

首先你所有的模型类的可以关注一下:

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"); 

将直接返回元素,其中名称是“部分-A”。

了解更多关于LINQ这里:https://msdn.microsoft.com/en-us/library/bb308959.aspx