57 votos

¿Cómo puedo encontrar el último elemento de una Lista<> ?

El siguiente es un extracto de mi código:

public class AllIntegerIDs 
{
    public AllIntegerIDs() 
    {            
        m_MessageID = 0;
        m_MessageType = 0;
        m_ClassID = 0;
        m_CategoryID = 0;
        m_MessageText = null;
    }

    ~AllIntegerIDs()
    {
    }

    public void SetIntegerValues (int messageID, int messagetype,
        int classID, int categoryID)
    {
        this.m_MessageID = messageID;
        this.m_MessageType = messagetype;
        this.m_ClassID = classID;
        this.m_CategoryID = categoryID;
    }

    public string m_MessageText;
    public int m_MessageID;
    public int m_MessageType;
    public int m_ClassID;
    public int m_CategoryID;
}

Estoy tratando de usar el siguiente en mi función main() código:

List<AllIntegerIDs> integerList = new List<AllIntegerIDs>();

/* some code here that is ised for following assignments*/
{
   integerList.Add(new AllIntegerIDs());
   index++;
   integerList[index].m_MessageID = (int)IntegerIDsSubstring[IntOffset];
   integerList[index].m_MessageType = (int)IntegerIDsSubstring[IntOffset + 1];
   integerList[index].m_ClassID = (int)IntegerIDsSubstring[IntOffset + 2];
   integerList[index].m_CategoryID = (int)IntegerIDsSubstring[IntOffset + 3];
   integerList[index].m_MessageText = MessageTextSubstring;
}

Problema: estoy tratando de imprimir todos los elementos de mi Lista utilizando un bucle for:

for (int cnt3 = 0 ; cnt3 <= integerList.FindLastIndex ; cnt3++) //<----PROBLEM HERE
{
   Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\n", integerList[cnt3].m_MessageID,integerList[cnt3].m_MessageType,integerList[cnt3].m_ClassID,integerList[cnt3].m_CategoryID, integerList[cnt3].m_MessageText);
}

Quiero encontrar el último elemento para que me equiparar cnt3 en mi bucle for y imprimir todas las entradas en la Lista. Cada elemento de la lista es un objeto de la clase AllIntegerIDs como se mencionó anteriormente en el ejemplo de código. ¿Cómo puedo encontrar la última entrada válida en la Lista?

Debo usar algo como integerList.Encontrar(integerList[].m_MessageText == null;

Si uso que va a tener un índice que va de 0 a lo máximo. Significa que voy a tener que usar otro bucle for que no tengo la intención de uso. Hay un corto/mejor manera?

Gracias, Viren

98voto

Para obtener el último elemento de una colección de uso LastOrDefault() y Last() los métodos de extensión

var lastItem = integerList.LastOrDefault();

O

var lastItem = integerList.Last();

Recuerde agregar using System.Linq;, o este método no estará disponible.

80voto

Jared Puntos 3852

Si sólo desea acceder al último elemento de la lista que usted puede hacer

var item = integerList[integerList.Count - 1];

para obtener el número total de elementos en la lista, usted puede utilizar el Recuento de propery

var itemCount = integerList.Count;

10voto

JFDev Puntos 51

Permite llegar a la raíz de la cuestión, cómo abordar el último elemento de una Lista de forma segura...

Suponiendo

List<string> myList = new List<string>();

Entonces

//NOT safe on an empty list!
string myString = myList[myList.Count -1];

//equivalent to the above line when Count is 0, bad index
string otherString = myList[-1];

"count-1" es un mal hábito, a menos que primero garantizar la lista no está vacía.

No hay una manera conveniente de alrededor de comprobación para la lista vacía excepto para hacerlo.

El camino más corto que puedo pensar es en

string myString = (myList.Count != 0) ? myList [ myList.Count-1 ] : "";

usted podría ir a por todas y hacer un delegado que siempre devuelve true, y se pasa a FindLast, que devuelve el último valor (o por defecto, construido valye si la lista está vacía). Esta función se inicia al final de la lista así que va a ser Grande O(1) o constante de tiempo, a pesar de que el método normalmente ser O(n).

//somewhere in your codebase, a strange delegate is defined
private static bool alwaysTrue(string in)
{
    return true;
}

//Wherever you are working with the list
string myString = myList.FindLast(alwaysTrue);

El FindLast método es fea si se tiene en cuenta el delegado parte, pero sólo se necesita ser declarado un solo lugar. Si la lista está vacía, se devolverá un valor predeterminado el valor calculado de la lista "tipo" para la cadena. Tomando el alwaysTrue delegado un paso más allá, haciendo una plantilla en lugar de tipo de cadena, sería más útil.

3voto

RiddlerDev Puntos 1893

Trate de usar una Para Cada uno, en lugar de una De las listas. Será mucho más fácil.

3voto

Eric J. Puntos 73338

Cambio

for (int cnt3 = 0 ; cnt3 <= integerList.FindLastIndex ; cnt3++)

a

for (int cnt3 = 0 ; cnt3 < integerList.Count; cnt3++)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X