定义对象列表。通过对象

时间:2017-04-05 09:42:49

标签: c# oop

我们如何在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) },
    };

但是如你所见,我必须两次声明部分名称,看起来不够优雅。有更优雅的方式吗?

5 个答案:

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