Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问对象类似于索引,但在C中是按名称访问的#_C#_Properties_Indexing - Fatal编程技术网

C# 访问对象类似于索引,但在C中是按名称访问的#

C# 访问对象类似于索引,但在C中是按名称访问的#,c#,properties,indexing,C#,Properties,Indexing,我必须上课,父亲和孩子(举例) 我的实现的一个片段 班主任 public class Father { public int Id { get; set; } public string Name { get; set; } public List<Child> Children { get; set; } public Father() { } } 我正试着做这样的事情 Father f = new Father(

我必须上课,父亲和孩子(举例)

我的实现的一个片段

班主任

public class Father
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Child> Children { get; set; }

    public Father()
    {
    }
}
我正试着做这样的事情

        Father f = new Father();
        f.Children[0]; // ok
        f.Children[1]; // ok
        f.Children["John"]; // Duh!
我现在,这是错误的,我需要在儿童课上实现一些东西,我尝试过这个

    public Child this[string name]
    {
        get
        {
            return this;
        }
    }
但这不起作用

如何为我的班级孩子实现此功能?

A
列表
没有字符串索引器;您可以向父类添加一个,但用法如下:

var child = parent["Fred"];
(不包括儿童)

对于索引器本身:Try(在索引器中):

要在列表本身上获取索引器,您必须创建一个自定义列表类型并在其中添加索引器

在国际海事组织,一种方法可能更清晰(关于父亲):


您将子项列表视为一个(可以通过键访问字典)。只需将列表更改为字典,并将字符串设置为孩子的名字。

在父类中,您可以编写以下代码:

public Child this[string name]
{
    get
    {
        return Children.Where(c => c.Name == name);
    }
}
然后像这样使用它:

    Father f = new Father();
    f.Children[0]; // ok
    f.Children[1]; // ok
    f["John"]; // ok!

您可以将
子项
列表设置为一个索引,以便通过索引或键引用它,然后添加以名称作为键的对象。不过,您要知道,如果您有多个同名的子项,这些选项中的任何一个都可能会遇到问题。

或者您可以这样设置:

public class Father
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Children Children { get; set; }

    public Father()
    {
    }
}
public class Children : List<Child>
{
    public Child this[string name]
    {
        get
        {
            return this.FirstOrDefault(tTemp => tTemp.Name == name);
        }
    }
}
public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Child()
    {
    }
}
公共类父
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共子项{get;set;}
公父()
{
}
}
公营班级儿童:名单
{
公共子项此[字符串名称]
{
得到
{
返回此.FirstOrDefault(tTemp=>tTemp.Name==Name);
}
}
}
公营儿童
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共儿童()
{
}
}

然后你想怎么称呼它。

+1,OP的第一个问题是他将
this
属性放在了错误的类中。这样,我将访问名为John的父亲,而不是名为johnth的孩子。这是不正确的。像这样,您要求父亲查找具有指定名称的孩子。这就是父亲在使用Where()子句的实现中所做的。另一个不能在子类中编写的重要原因是父亲有权访问
子类
集合。一个孩子无法访问所有其他孩子。谢谢Marc。我知道如何使用Linq实现这一点,但我知道,我想通过Indexer实现accessin的功能。我无法通过字符串索引+1访问对象列表。解决这个问题可以解释为什么许多.Net Framework控件对集合使用专用类。(例如,
控件
控件
成员使用
控件.控件集合
而不是
列表
)。我同意马克的观点,直接使用索引器是不明确的。
parent[“Fred”]
返回父对象名为“Fred”的子对象的想法是非常不直观的。但在这种情况下,您不能再通过索引访问:)感谢指向OrderedDictionary类的指针。正是我想要的。@AnthonyVO-很高兴它帮了我的忙!:)
public Child this[string name]
{
    get
    {
        return Children.Where(c => c.Name == name);
    }
}
    Father f = new Father();
    f.Children[0]; // ok
    f.Children[1]; // ok
    f["John"]; // ok!
public class Father
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Children Children { get; set; }

    public Father()
    {
    }
}
public class Children : List<Child>
{
    public Child this[string name]
    {
        get
        {
            return this.FirstOrDefault(tTemp => tTemp.Name == name);
        }
    }
}
public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Child()
    {
    }
}