Tengo un listView en mi aplicación. Yo bucle a través de los elementos para comprobar que uno está seleccionado y, a continuación, devuelve un valor. Como todos los caminos tienen que devolver un valor que tengo para devolver un valor fuera del bucle que sobrescribe el bucle de retorno, cómo puedo hacer esto sin sobrescribirlo después de que el bucle?

public string GetItemValue()
{
    for (int i = 0; i < listView1.Items.Count; i++)
    {
        if (listView1.Items[i].Checked == true)
        {
            return listView1.Items[i].Text; //I want to keep this value
        }
     }
     //Without overwriting it with this but the compiler 
     //requires me to return a value here
     return "Error"; 
}

Cualquier ayuda es muy apreciada. Gracias.

P. S he intentado usar el descanso tras el si pero no hubo suerte.

  • Usted no necesita preocuparse acerca de esto. Tan pronto como llega la primera return dentro del bucle, se devolverá inmediatamente con ese valor. No hay código fuera del bucle se haya golpeado en ese caso.
  • Hizo que probarlo para ver lo que realmente pasa?
  • Cuando lo ejecuto, sólo devuelve el texto del error…
  • C ¿de verificación de un elemento? Romper a pesar de que para asegurarse de que su instrucción if es la siguiente a través de.
  • Si devuelve el texto de Error, entonces su if condición del bucle es nunca pasar.
  • Tu comentario debe ser una respuesta.
  • No va a hacer ninguna diferencia, pero la == true es superfluo. Acaba de escribir if (listView1.Items[i].Checked).
  • Gracias por todas tus respuestas, voy a tratar de cada uno y ver que uno(s) de trabajo!
  • Tos ListView.SelectedItems.

InformationsquelleAutor Bali C | 2011-09-26

8 Comentarios

  1. 9

    En editar: traer abajo de mi comentario de arriba.

    Usted no necesita preocuparse acerca de esto. Tan pronto como llega la primera return dentro del bucle, se devolverá inmediatamente con ese valor. No hay código fuera del bucle se haya golpeado en ese caso.

    Por cierto, este código sería más limpio:

    public string GetItemValue()
    {
        foreach (var item in listView1.Items)
        {
            if (item.Checked) return item.Text;
        }
        throw new InvalidOperationException("No checked items found");
    }

    Excepciones son más idiomáticas forma de manejo de errores, y la foreach bucle se prefiere a un for bucle cuando estás a iterar sobre colecciones.

    También el uso de LINQ, usted puede conseguir aún más concisa:

    public string GetItemValue()
    {
        return listView1.Items.Cast<ListViewItem>().Single(i => i.Checked).Text;
    }
    • Cambiar el new Exception() a una más tipo específico, y agregar un Cast<ListViewItem>() en el segundo ejemplo, y va a ser perfecto. 😉
    • Buenos puntos. Se me había olvidado que Windows Forms objetos de retorno no genérica de los contenedores. Es triste que todos estos viejos aparatos están todavía dando vueltas con su idiosincrasia intacto!
  2. 4

    Bien, su regreso fuera del bucle, return "Error"; no debe ser llamado basado en la lógica. Desde return causas de su método para salir inmediatamente, el «Error» volver nunca va a suceder, que es menos que el código de nunca pasos en el if dentro del bucle.

    Todas las cosas consideradas, esto puede ser un excepcional caso en el código. Por lo tanto, lanzar una excepción puede ser el apropiado:

    public string GetItemValue()
            {
                for (int i = 0; i < listView1.Items.Count; i++)
                {
                    if (listView1.Items[i].Checked == true)
                    {
                        return listView1.Items[i].Text; //I want to keep this value
                    }
                }
                throw new InvalidOperationException("Did not find value expected.");
            }

    Excepciones son generalmente lanzado para indicar que existe un error en el código. Un «Hey, que realmente debería no estar pasando.» La aplicación se detiene, y es de esperar que el usuario tiene la oportunidad de contactar con el soporte para ayudarle a reproducir.

    Basado en tu comentario:

    Cuando lo ejecuto, sólo devuelve el texto del error…

    Que significa su cheque en la if declaración no está teniendo éxito.

    if (listView1.Items[i].Checked == true)

    Lo que significa que ninguno de sus artículos en su ListView se comprueban.

  3. 2

    Ese es el tipo de situaciones en las que usted es probablemente mejor de lanzar una excepción con el fin de indicar la situación excepcional:

    public string GetItemValue()
    {
        for (int i = 0; i < listView1.Items.Count; i++)
        {
            if (listView1.Items[i].Checked == true)
            {
                //Here you are leaving the GetItemValue method
                //and the loop stops
                return listView1.Items[i].Text;
            }
        }
        //if we get that far it means that none of the items of
        //the select list was actually checked => we are better of
        //reporting this to the caller of the method
        throw new Exception("Please select a value");
    }
  4. 2

    La vuelta en el bucle for no se sobrescriba — el método devolverá el valor en el bucle si sus condiciones se cumplen. La ejecución del método termina inmediatamente después de llegar a un return declaración.

    Si el método devuelve «Error», entonces te recomiendo mirar tu código en un depurador, porque es llegar a la final del bucle y devolver el valor de «Error».

  5. 2

    Si usted está devolviendo un valor en el bucle, no debe llegar a la vuelta en el bucle. Me gustaría comprobar para asegurarse de que el bucle es encontrar el elemento seleccionado.

    La otra opción es crear una variable para almacenar el valor de retorno:

    string returnValue = "Error";
    
    for (int i = 0; i < listView1.Items.Count; i++) 
    { 
        if (listView1.Items[i].Checked == true) 
        { 
            returnValue = listView1.Items[i].Text;
            break;
        } 
    } 
    
    return returnValue;

    Por último, también es posible que considere la posibilidad de devolver una excepción cuando no selecciones se encuentran, y el manejo de la excepción de la llamada método.

  6. 1

    La return "Error" bits no sobrescribir el bucle de retorno de valor. Cuando un return es golpeado, sale de la función, así que cuando un valor que se ha seleccionado se encuentra, la función va a escupir sus datos y parada.

  7. 1

    El compilador requiere que todos los caminos de la función devuelva un valor. El compilador no puede saber de antemano si su bucle interno si la condición se cumple. Usted puede almacenar el valor en una variable y devolver esta en la final de la función por ejemplo :

    public string GetItemValue()
        {
            string temp = null;
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                if (listView1.Items[i].Checked == true)
                {
                    temp = listView1.Items[i].Text; //I want to keep this value
                    break;
                }
            }
            return temp; //Without overwriting it with this but the compiler requires me to return a value here
        }
    • Esto es incorrecto. Compilador de la rechazarán, por la misma razón que el código original – el temp variable no ha sido definitivamente un valor asignado.
    • La razón para downvoting ? Lo siento se me olvidó agregar = null…
  8. 1

    Realidad, no hay ninguna necesidad de un bucle aquí:

    return (listView1.SelectedItems.Count > 0)
        ? listView1.SelectedItems[0].Text
        : "Error";

    Pero, como se dijo, la pregunta original es engañosa, ya que return no anulan los valores. Usted podría estar pensando acerca de la asignación, en lugar de regresar. En este caso un código de trabajo puede tener este aspecto:

    string ret = "Error";
    foreach(var item in listView1.Items)
    {
        if(item.Checked) { ret = item.Text; break; }
    }
    
    return ret;

Dejar respuesta

Please enter your comment!
Please enter your name here