Доступ к объекту, как по индексу, но по имени в C # - PullRequest
3 голосов
/ 10 декабря 2010

У меня есть классы Father и Child (по примеру)

Фрагмент моей реализации

Класс Father.cs

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

    public Father()
    {
    }
}

Класс Child.cs

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Child()
    {
    }

}

Я пытаюсь сделать что-то подобное

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

Теперь я ошибаюсь, мне нужно реализовать что-то в дочернем классе, я попробовал это

    public Child this[string name]
    {
        get
        {
            return this;
        }
    }

Но это не работает.

Как я могу реализовать эту функцию для моего класса Child?

Ответы [ 5 ]

6 голосов
/ 10 декабря 2010

A List<T> не имеет индексатора строки;Вы можете добавить один класс Father, но его использование будет следующим:

var child = parent["Fred"];

(без .Children)

Для самого индексатора: Попробуйте (в индексаторе):

return Children.FirstOrDefault(c=>c.Name==name);

Чтобы получить индексатор в самом списке, вам нужно создать собственный тип списка и добавить туда индексатор.

IMO, метод может быть более понятным (для Отца):

public Child GetChildByName(string name) {...}
4 голосов
/ 10 декабря 2010

Или вы можете настроить его так:

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()
    {
    }
}

Тогда ты называешь это как хочешь.

4 голосов
/ 10 декабря 2010

В классе отца вы могли бы написать следующий код:

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!
1 голос
/ 10 декабря 2010

Вы можете сделать список Children в OrderedDictionary , чтобы можно было ссылаться на него по индексу или ключу, а затем добавить объекты с именем в качестве ключа. Тем не менее, вы должны знать, что любой из этих вариантов может столкнуться с проблемами, если у вас есть несколько детей с одним и тем же именем.

1 голос
/ 10 декабря 2010

Вы обрабатываете список детей как словарь (словари доступны по ключу). Просто измените свой список на словарь и установите строку для имени ребенка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...