Comment trouver le dernier élément dans une liste ?

Voici un extrait de mon code:

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 ssortingng m_MessageText; public int m_MessageID; public int m_MessageType; public int m_ClassID; public int m_CategoryID; } 

J’essaie d’utiliser les éléments suivants dans mon code de fonction main ():

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

Le problème est ici: j’essaie d’imprimer tous les éléments de ma liste en utilisant une boucle 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); } 

Je veux trouver le dernier élément afin que j’assimile cnt3 dans ma boucle for et que j’imprime toutes les entrées de la liste. Chaque élément de la liste est un object de la classe AllIntegerIDs mentionné ci-dessus dans l’exemple de code. Comment trouver la dernière entrée valide dans la liste?

Dois-je utiliser quelque chose comme integerList.Find (integerList []. M_MessageText == null;

Si je l’utilise, il faudra un index allant de 0 à tout maximum. Cela signifie que je devrai utiliser un autre pour la boucle que je n’ai pas l’intention d’utiliser. Y a-t-il un moyen plus court / meilleur?

Merci Viren

Si vous voulez juste accéder au dernier élément de la liste, vous pouvez le faire

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

pour obtenir le nombre total d’éléments dans la liste, vous pouvez utiliser la propriété Nombre

 var itemCount = integerList.Count; 

Pour obtenir le dernier élément d’une collection, utilisez les méthodes d’extension LastOrDefault () et Last ()

 var lastItem = integerList.LastOrDefault(); 

OU

 var lastItem = integerList.Last(); 

N’oubliez pas d’append à l’ using System.Linq; , ou cette méthode ne sera pas disponible.

Allons à la racine de la question, comment aborder le dernier élément d’une liste en toute sécurité …

En supposant

 List myList = new List(); 

alors

 //NOT safe on an empty list! ssortingng mySsortingng = myList[myList.Count -1]; //equivalent to the above line when Count is 0, bad index ssortingng otherSsortingng = myList[-1]; 

“count-1” est une mauvaise habitude à moins que vous ne garantissiez d’abord que la liste n’est pas vide.

Il n’y a pas de moyen pratique de vérifier la liste vide, sauf pour le faire.

Le plus court chemin que je peux penser est

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

vous pouvez sortir tout et créer un délégué qui retourne toujours true, et le transmettre à FindLast, qui renverra la dernière valeur (ou la valeur par défaut construite si la liste est vide). Cette fonction commence à la fin de la liste, donc Big O (1) ou temps constant, même si la méthode est normalement O (n).

 //somewhere in your codebase, a strange delegate is defined private static bool alwaysTrue(ssortingng in) { return true; } //Wherever you are working with the list ssortingng mySsortingng = myList.FindLast(alwaysTrue); 

La méthode FindLast est laide si vous comptez la partie délégué, mais il suffit de la déclarer à un endroit. Si la liste est vide, elle renverra une valeur construite par défaut du type de liste “” pour la chaîne. Prendre le delegue de alwaysTrue un peu plus loin, en faisant un gabarit au lieu du type de ficelle, serait plus utile.

Changement

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

à

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

Essayez d’utiliser un For Each au lieu d’un For pour les listes. Ce sera beaucoup plus facile.

 int lastInt = integerList[integerList.Count-1]; 

Pourquoi ne pas simplement utiliser la propriété Count sur la liste?

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

Utilisez la propriété Count . Le dernier index sera Count - 1 .

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

Il faudrait que je convienne qu’un foreach serait beaucoup plus facile

 foreach(AllIntegerIDs allIntegerIDs in integerList) { Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\n", allIntegerIDs.m_MessageID, allIntegerIDs.m_MessageType, allIntegerIDs.m_ClassID, allIntegerIDs.m_CategoryID, allIntegerIDs.m_MessageText); } 

Aussi, je vous suggère d’append des propriétés pour accéder à vos informations au lieu de champs publics, en fonction de votre version .net, vous pouvez l’append comme public int MessageType {get; set;} public int MessageType {get; set;} et se débarrasser de la m_ de vos champs publics, propriétés etc comme il ne devrait pas être là.

Indépendamment de votre question initiale, vous obtiendrez de meilleures performances si vous capturez plusieurs fois des références à des variables locales plutôt qu’un index dans votre liste:

 AllIntegerIDs ids = new AllIntegerIDs(); ids.m_MessageID = (int)IntegerIDsSubssortingng[IntOffset]; ids.m_MessageType = (int)IntegerIDsSubssortingng[IntOffset + 1]; ids.m_ClassID = (int)IntegerIDsSubssortingng[IntOffset + 2]; ids.m_CategoryID = (int)IntegerIDsSubssortingng[IntOffset + 3]; ids.m_MessageText = MessageTextSubssortingng; integerList.Add(ids); 

Et dans votre for loop:

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

Vous pouvez le trouver en comptant d’abord le nombre d’éléments de la liste, par exemple

 int count = list.Count(); 

Ensuite, vous pouvez indexer le compte – 1 pour obtenir le dernier élément de la liste, par exemple

 int lastNumber = list[count - 1];