Как я могу найти последний элемент в списке?



ниже приводится выдержка из моего кода:



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


Я пытаюсь использовать следующее В моем основном() коде функции:



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


проблема здесь: я пытаюсь распечатать все элементы в моем списке, используя цикл 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);
}


Я хочу найти последний элемент, чтобы я приравнял cnt3 в моем цикле for и распечатал все записи в списке. Каждый элемент в списке является объектом класса AllIntegerIDs, как указано выше в примере кода. Как я найти последнюю допустимую запись в списке?



Я должен использовать что-то вроде integerList.Найти(integerList[].m_MessageText = = null;



Если я использую это, ему понадобится индекс, который будет варьироваться от 0 до любого максимума. Значит, мне придется использовать другой цикл, который я не собираюсь использовать. Есть ли более короткий / лучший способ?



спасибо,
Вирен

704   11  

11 ответов:

Если вы просто хотите получить доступ к последнему элементу в списке, вы можете сделать

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

чтобы получить общее количество элементов в списке, вы можете использовать свойство Count

var itemCount = integerList.Count;

чтобы получить последний элемент коллекции использовать LastOrDefault () и Last () методы расширения

var lastItem = integerList.LastOrDefault();

или

var lastItem = integerList.Last();

не забудьте добавить using System.Linq;, или этот метод будет недоступен.

давайте перейдем к корню вопроса, как безопасно обращаться к последнему элементу списка...

предполагая, что

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

затем

//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" - это плохая привычка, если вы сначала не гарантируете, что список не пуст.

нет удобного способа проверить пустой список, кроме как сделать это.

самый короткий путь, который я могу придумать, это

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

вы можете пойти все и сделать делегат, который всегда возвращается true, и передайте его в FindLast, который вернет последнее значение (или по умолчанию построенное valye, если список пуст). Эта функция начинается в конце списка, поэтому будет большим O(1) или постоянным временем, несмотря на то, что метод обычно является 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);

метод FindLast уродлив, если вы считаете часть делегата, но он должен быть объявлен только в одном месте. Если список пуст, он вернет построенное по умолчанию значение типа списка "" для string. Принимая делегат alwaysTrue шаг дальше, сделав его шаблоном вместо строкового типа, было бы более полезно.

изменить

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

до

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

попробуйте использовать для каждого, а не для списков. Это будет намного проще.

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

почему бы просто не использовать свойство count в списке?

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

использовать Count собственность. Последний индекс будет Count - 1.

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

Я должен был бы согласиться, что foreach будет намного проще что-то вроде

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

также я бы предложил вам добавить свойства для доступа к вашей информации вместо открытых полей, в зависимости от вашей версии .net вы можете добавить его как public int MessageType {get; set;} и избавиться от m_ из ваших общедоступных полей, свойств и т. д., поскольку их там не должно быть.

независимо от вашего исходного вопроса, Вы получите лучшую производительность, если вы будете захватывать ссылки на локальные переменные, а не индексировать в свой список несколько раз:

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

и в 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);
}

вы можете найти его, сначала подсчитав количество элементов в списке, например

int count = list.Count();

затем вы можете проиндексировать count-1, чтобы получить последний элемент в списке, например

int lastNumber = list[count - 1];

Comments

    Ничего не найдено.