Lo 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 lo siguiente en mi código de función main ():
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;
}
El problema está aquí: estoy tratando de imprimir todos los elementos en mi lista usando 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 poder cnt3 cnt3 en mi bucle for e imprimir todas las entradas en la lista. Cada elemento de la lista es un objeto de la clase AllIntegerID como se mencionó anteriormente en el ejemplo de código. ¿Cómo encuentro la última entrada válida en la Lista?
¿Debo usar algo como integerList.Find (integerList []. M_MessageText == null;
Si lo uso, necesitará un índice que oscilará entre 0 y el máximo. Significa que tendré que usar otro bucle for que no tengo la intención de usar. ¿Hay una forma más corta / mejor?
Gracias viren
AllIntegerIDs newItem = new AllIntegerID();
, use eso para asignar todos los campos y luego llameintegerList.Add(newItem)
. O use propiedades en lugar de campos y use la sintaxis de inicializador de objeto C # 3.0.Respuestas:
Si solo desea acceder al último elemento de la lista, puede hacerlo
para obtener el número total de elementos en la lista, puede usar la propiedad Count
fuente
Last
/LastOrDefault
como se menciona a continuación.Enumerable.Last
lanzará una excepción si la lista está vacía. Si llamaEnumerable.LastOrDefault
y pasa una lista de tipos de valores, se devolverá el valor predeterminado si la lista está vacía. Por lo tanto, si obtiene 0 de aList<int>
, no sabrá si la lista estaba vacía o si el último valor fue 0. En resumen, debe verificar elCount
mecanismo de recuperación que decida utilizar.var element = list[list.Count - 1]
es muy sucinta y legible. No es necesario invocar métodos de extensiónPara obtener el último elemento de un uso de la colección LastOrDefault () y Last () los métodos de extensión
O
Recuerde agregar
using System.Linq;
, o este método no estará disponible.fuente
First
,FirstOrDefault
,Last
,LastOrDefault
,Single
,SingleOrDefault
,ElementAt
yElementAtOrDefault
están optimizados paraIList<TSource>
,Count
yContains
están optimizados paraICollection<TSource>
yCast<TResult>
está optimizado paraIEnumerable<TResult>
.using System.Linq;
System.Linq.Enumerable
no están realmente 'optimizados'. Aquí está el código para elEnumerable.Last
método.System.Linq.Enumerable.Last
, estoy de acuerdo con 0b101010, elLast()
código no está "optimizado paraList<>
s",Last()
es solo un contenedor feo, que por defecto esreturn list[list.Count-1]
en caso de que el argumento seaIList
, e itera sobre la lista hasta el final en caso de que no lo es ... lo que lo convierte en una solución muy pobre siIList
es aLinkedList
, ya que el indexador solo recorrerá la lista innecesariamente (no he encontrado una anulación iterando hacia atrásItem[]
con index> Count / 2 en las fuentes de c #, YMMV )Veamos la raíz de la pregunta, cómo abordar el último elemento de una Lista de forma segura ...
Asumiendo
Luego
"contar-1" es un mal hábito a menos que primero garantices que la lista no está vacía.
No hay una manera conveniente de verificar la lista vacía, excepto para hacerlo.
La forma más corta en la que puedo pensar es
podría hacer todo lo posible y hacer un delegado que siempre devuelva verdadero, y pasarlo a FindLast, que devolverá el último valor (o valor predeterminado construido si la lista está vacía). Esta función comienza al final de la lista, por lo que será Big O (1) o tiempo constante, a pesar de que el método normalmente es O (n).
El método FindLast es feo si cuenta la parte de delegado, pero solo necesita declararse un lugar. Si la lista está vacía, devolverá un valor construido predeterminado del tipo de lista "" para cadena. Sería más útil llevar al delegado alwaysTrue un paso más, convirtiéndolo en una plantilla en lugar de un tipo de cadena.
fuente
myList.FindLast(_unused_variable_name => true);
esto funcionará independientemente del tipo. Una versión más corta esmyList.FindLast(_ => true);
, pero creo que solo el guión bajo (o cualquier otro identificador de un solo carácter) puede ser un poco confuso a veces.fuente
Cambio
a
fuente
Usa la
Count
propiedad. El último índice seráCount - 1
.fuente
Puede encontrarlo contando primero el número de elementos en la lista, por ejemplo
Luego puede indexar el conteo - 1 para obtener el último elemento en la lista, por ejemplo
fuente
En C # 8.0 puede obtener el último elemento con ^ explicación completa del operador
fuente
¿Por qué no solo usar la propiedad Count en la lista?
fuente
Independientemente de su pregunta original, obtendrá un mejor rendimiento si captura referencias a variables locales en lugar de indexarlas en su lista varias veces:
Y en tu
for
bucle:fuente
Tendría que aceptar que un foreach sería mucho más fácil.
También le sugiero que agregue propiedades para acceder a su información en lugar de campos públicos, dependiendo de su versión .net puede agregarla
public int MessageType {get; set;}
y eliminarla dem_
sus campos públicos, propiedades, etc., ya que no debería estar allí.fuente
Creo que esto te ayuda. por favor, compruebe
fuente