Можно ли использовать «возврат» и «выход» одновременно? - PullRequest
0 голосов
/ 11 октября 2011

У меня есть метод GetSelectedServices(), который возвращает выбранные узлы из списка дерева, Ожидая возврата с тем же методом выбранных узлов и всех узлов, я пытался добавить параметр out.

Но когда я вызываю этот метод, я должен дать параметр out, поэтому возвращаемый список с selectedNodes маскируется, и я не могу его получить.

Мой метод

internal List<__ServiceInfo> GetSelectedServices(out List<__ServiceInfo> lstAll)
{
    List<__ServiceInfo> lstSelected = new List<__ServiceInfo>();
    List<__ServiceInfo> lstA = new List<__ServiceInfo>();

    foreach (TreeListNode node in this.tlServices.Nodes)
    {
        if (node.Checked)
        {
            var service = this.tlServices.GetDataRecordByNode(node) as __ServiceInfo;
            lstA.Add(service);

            if (service != null)
            {
                lstSelected.Add(service);
            }

            if (node.Nodes.Count > 0)
            {
                foreach (TreeListNode subNode in node.Nodes)
                {
                    if (subNode.Checked)
                    {
                        service = this.tlServices.GetDataRecordByNode(subNode) as __ServiceInfo;
                        lstA.Add(service);

                        if (service != null)
                        {
                            lstSelected.Add(service);
                        }
                    }
                }
            }
        }
    }
    lstAll = lstA;

    return lstSelected;
}

Способ, которым я называю метод

public bool HasValidModel()
{
    List<__ServiceInfo> lstAll = new List<__ServiceInfo>();
    //here I get all nodes
    var allServices = this.GetAllServices(out lstAll);

    List<__ServiceInfo> lstSelected = new List<__ServiceInfo>();
    //but how to get the list from  ""return lstSelected"";
}

спасибо за любые предложения.

Ответы [ 3 ]

4 голосов
/ 11 октября 2011

У вас уже есть две переменные, хотя вы инициализируете одну из них без необходимости. Просто используйте:

public bool HasValidModel()
{
    List<__ServiceInfo> lstAll;
    var selectedServices = this.GetAllServices(out lstAll);

    // Now use lstAll and selectedServices
}

Лично мне не очень нравится использовать параметры много, и я бы искал альтернативный дизайн, если это возможно, но это отдельный вопрос. (Я бы отделил поиск всех сервисов от выбора некоторых из них.)

3 голосов
/ 11 октября 2011

То, как вы реализовали параметры return и out, кажется вполне подходящим. Но вызов неверен. Ответ @ Кена указывает в правильном направлении.

Однако логика в методе GetSelectedServices странная. Единственная разница между «выбранной» услугой и «обычной» услугой заключается в том, что «обычной» услугой является NULL. Это приводит к тому, что список allServices представляет собой набор значений NULL плюс выбранные сервисы. Что, на мой взгляд, не имеет смысла.

3 голосов
/ 11 октября 2011

Просто используйте две переменные, например:

List<__ServiceInfo> lst;
List<__ServiceInfo> lstSelected = GetSelectedServices(out lst);

На возвращаемый объект теперь ссылается lstSelected, а на out ed ссылается lst.

...