web-dev-qa-db-fra.com

Comment trouver le dernier élément d'une liste <>?

Ce qui suit est 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 string 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<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;
}

Le problème est là: 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 pour que je mette cnt3 dans ma boucle for et affiche toutes les entrées de la liste. Chaque élément de la liste est un objet de la classe AllIntegerIDs, comme indiqué ci-dessus dans l'exemple de code. Comment trouver la dernière entrée valide dans la liste?

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

Si j'utilise cela, il faudra un index compris entre 0 et le maximum. Cela signifie que je devrai utiliser une autre boucle for que je n'ai pas l'intention d'utiliser. Y a-t-il un moyen plus court/meilleur?

Merci Viren

147
zack

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;
178
Jared

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

var lastItem = integerList.LastOrDefault();

OR

var lastItem = integerList.Last();

Rappelez-vous d’ajouter using System.Linq;, sinon cette méthode ne sera pas disponible.

240

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

En supposant

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

Ensuite

//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" 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 auquel je peux penser est

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

vous pouvez aller jusqu'au bout et créer un délégué qui renvoie toujours la valeur true et le transmettre à FindLast, qui renverra la dernière valeur (ou la valeur construite par défaut si la liste est vide). Cette fonction commence à la fin de la liste et sera donc Big O(1) ou un temps constant, bien que la méthode soit normalement 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);

La méthode FindLast est moche si vous comptez la partie déléguée, mais il suffit qu'elle soit déclarée à un endroit. Si la liste est vide, elle retournera une valeur construite par défaut du type de liste "" pour chaîne. Il serait plus utile d’aller plus loin dans le délégué alwaysTrue pour en faire un modèle au lieu d’un type de chaîne.

16
JFDev

Changement

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

à

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

Essayez d’utiliser une liste For Each au lieu de For for. Ce sera beaucoup plus facile.

3
RiddlerDev
int lastInt = integerList[integerList.Count-1];
3
Dan Diplo

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

int count = list.Count();

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

int lastNumber = list[count - 1];

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

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

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

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

Je devrais convenir qu'un foreach serait beaucoup plus facile quelque chose comme

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érerais d’ajouter des propriétés pour accéder à vos informations plutôt qu’aux champs publics. En fonction de votre version .net, vous pouvez l’ajouter comme public int MessageType {get; set;} et vous débarrasser de m_ de vos champs publics, propriétés, etc. il ne devrait pas être là.

0
Michael Ciba

Je pense que cela vous aide. Vérifiez s'il vous plaît

    TaxRangers[TaxRangers.Count]. max
0
sandeep sandy

Indépendamment de votre question initiale, vous obtiendrez de meilleures performances si vous capturez des références à des variables locales plutôt que d'indexer plusieurs fois dans votre liste:

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

Et dans votre boucle for:

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);
}
0
dahlbyk