How can I find the last element in a List<>?

后端 未结 13 1310
离开以前
离开以前 2020-12-12 21:43

The following is an extract from my code:

public class AllIntegerIDs 
{
    public AllIntegerIDs() 
    {            
        m_MessageID = 0;
        m_Messa         


        
相关标签:
13条回答
  • 2020-12-12 21:47

    Independent of your original question, you will get better performance if you capture references to local variables rather than index into your list multiple times:

    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);
    

    And in your 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);
    }
    
    0 讨论(0)
  • 2020-12-12 21:50

    To get the last item of a collection use LastOrDefault() and Last() extension methods

    var lastItem = integerList.LastOrDefault();
    

    OR

    var lastItem = integerList.Last();
    

    Remeber to add using System.Linq;, or this method won't be available.

    0 讨论(0)
  • 2020-12-12 21:51

    Why not just use the Count property on the List?

    for(int cnt3 = 0; cnt3 < integerList.Count; cnt3++)
    
    0 讨论(0)
  • 2020-12-12 21:55

    You can find it by first counting number of elements in the list e.g

    int count = list.Count();
    

    Then you can index the count - 1 to get last element in list e.g

    int lastNumber = list[count - 1];
    
    0 讨论(0)
  • 2020-12-12 21:58

    If you just want to access the last item in the list you can do

    if(integerList.Count>0)
    {
       var item = integerList[integerList.Count - 1];
    }
    

    to get the total number of items in the list you can use the Count property

    var itemCount = integerList.Count;
    
    0 讨论(0)
  • 2020-12-12 21:58

    Lets get at the root of the question, how to address the last element of a List safely...

    Assuming

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

    Then

    //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" is a bad habit unless you first guarantee the list is not empty.

    There is not a convenient way around checking for the empty list except to do it.

    The shortest way I can think of is

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

    you could go all out and make a delegate that always returns true, and pass it to FindLast, which will return the last value (or default constructed valye if the list is empty). This function starts at the end of the list so will be Big O(1) or constant time, despite the method normally being 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);
    

    The FindLast method is ugly if you count the delegate part, but it only needs to be declared one place. If the list is empty, it will return a default constructed value of the list type "" for string. Taking the alwaysTrue delegate a step further, making it a template instead of string type, would be more useful.

    0 讨论(0)
提交回复
热议问题