通过命名数组提供内部列表访问

时间:2010-06-23 14:07:38

标签: c# .net

我有一个类,其中包含其他对象的内部列表,如下所示:

public class Parent
{
    List<Child> _children;
}

Child说的是这样的:

public class Child
{
    public string Name;
}

我想要做的是设置父级,其中_children的成员可以这样访问:

...
Child kid = parentInstance["Billy"]; // would find a Child instance 
                                     // whose name value is Billy
...

这可能吗?我显然可以这样做:

Child kid = parentInstance.GetChild("Billy");

但我更喜欢数组/字典之类的语法。如果事实并非如此,这并不是什么大不了的事,而且我不想为达到语法糖而跳过一百万圈。

2 个答案:

答案 0 :(得分:7)

您可以为Parent类定义indexed property

public class Parent
{
    List<Child> _children;

    public Child this[string name] 
    {
        get
        {
            return (_children ?? Enumerable.Empty<Child>())
                .Where(c => c.Name == name)
                .FirstOrDefault();
        }
    }
}

答案 1 :(得分:0)

“数组语法”并不是最适合您所需要的,而且它也相当过时了:)

如今在.net中我们有Linq和lambda扩展方法,这使得我们在处理集合时的生活变得非常简单。

你可以这样做:

IEnumerable<Child> childs = parentInstance.Childrens.Where(child => child.Name == "Billy"); //this will get all childs named billy

Child child = parentInstance.Childrens.FirstOrDefault(child => child.Name == "Billy"); //this will get the first child named billy only, or null if no billy is found

您也可以用linq语法而不是lambda编写上述查询。例如,第一个查询将是这样的:

IEnumerable<Child> childs = from child in parentInstance.Childrens where child.Name == "billy" select child;