Вот выдержка из моего кода:
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;
}
Я пытаюсь использовать следующее в коде функции 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;
}
Проблема здесь: я пытаюсь напечатать все элементы в моем Списке, используя цикл 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.Find (integerList []. M_MessageText == null;
Если я использую это, ему понадобится индекс, который будет варьироваться от 0 до любого максимального значения. Значит, мне придется использовать другой цикл for, который я не собираюсь использовать. Есть более короткий / лучший способ?
Спасибо вирен
AllIntegerIDs newItem = new AllIntegerID();
, используйте это, чтобы назначить все поля, а затем вызватьintegerList.Add(newItem)
. Или используйте свойства, а не поля и используйте синтаксис инициализатора объекта C # 3.0.Ответы:
Если вы просто хотите получить доступ к последнему элементу в списке, вы можете сделать
чтобы получить общее количество элементов в списке, вы можете использовать свойство Count
источник
Last
/LastOrDefault
как указано ниже.Enumerable.Last
выдаст исключение, если список пуст. Если вы позвонитеEnumerable.LastOrDefault
и передадите список типов значений, будет возвращено значение по умолчанию, если список пуст. Поэтому, если вы получите 0 от a,List<int>
вы не будете знать, был ли список пуст или последнее значение было 0. Короче, вам нужно проверить,Count
какой механизм поиска вы решите использовать.var element = list[list.Count - 1]
он очень краткий и читаемый. Не нужно вызывать методы расширенияЧтобы получить последний элемент коллекции, используйте методы расширения LastOrDefault () и Last ()
ИЛИ
Запомните, чтобы добавить
using System.Linq;
, или этот метод не будет доступен.источник
First
,FirstOrDefault
,Last
,LastOrDefault
,Single
,SingleOrDefault
,ElementAt
иElementAtOrDefault
оптимизированы для работыIList<TSource>
,Count
иContains
оптимизированы для работыICollection<TSource>
иCast<TResult>
оптимизирован дляIEnumerable<TResult>
.using System.Linq;
System.Linq.Enumerable
самом деле, не «оптимизированы». Вот код дляEnumerable.Last
метода.System.Linq.Enumerable.Last
, я согласен с 0b101010 -Last()
код не "оптимизирован дляList<>
s" -Last()
это просто уродливая оболочка, которая по умолчанию используетсяreturn list[list.Count-1]
в случае, если аргумент являетсяIList
, и выполняет итерацию по списку до конца в случае, если это не ... делает его очень плохим решением, еслиIList
оно естьLinkedList
, так как индексатор просто без необходимости просматривает весь список (я не нашел переопределения, повторяющегося в обратном направленииItem[]
с index> Count / 2 в источниках c #, YMMV )Давайте разберемся в корне вопроса, как безопасно обратиться к последнему элементу списка ...
Если предположить,
затем
«count-1» - плохая привычка, если вы сначала не гарантируете, что список не пуст.
Существует не удобный способ проверки пустого списка, кроме как сделать это.
Самый короткий путь, который я могу придумать,
Вы можете сделать все возможное и создать делегат, который всегда возвращает true, и передать его FindLast, который вернет последнее значение (или созданный по умолчанию valye, если список пуст). Эта функция запускается в конце списка, поэтому будет Big O (1) или постоянным временем, несмотря на то, что метод обычно O (n).
Метод FindLast уродлив, если вы считаете часть делегата, но его нужно объявить только в одном месте. Если список пуст, он вернет созданное по умолчанию значение типа списка "" для строки. Дальнейшее продвижение делегата AlwaysTrue, сделав его шаблоном вместо строкового типа, было бы более полезным.
источник
myList.FindLast(_unused_variable_name => true);
это будет работать независимо от типа. Укороченная версия естьmyList.FindLast(_ => true);
, но я считаю, что только подчеркивание (или любой другой односимвольный идентификатор) может иногда быть немного запутанным.источник
+ Изменить
в
источник
Используйте
Count
собственность. Последний индекс будетCount - 1
.источник
Вы можете найти его, сначала посчитав количество элементов в списке, например
Затем вы можете проиндексировать счетчик - 1, чтобы получить последний элемент в списке, например
источник
В C # 8.0 вы можете получить последний элемент с оператором ^ полное объяснение
источник
Почему бы просто не использовать свойство Count в Списке?
источник
Независимо от вашего исходного вопроса, вы получите лучшую производительность, если будете фиксировать ссылки на локальные переменные, а не вносить их в свой список несколько раз:
И в вашем
for
цикле:источник
Я должен был бы согласиться, что foreach будет намного проще, что-то вроде
Также я бы посоветовал вам добавить свойства для доступа к вашей информации вместо открытых полей, в зависимости от вашей версии .net вы можете добавить ее, как
public int MessageType {get; set;}
и избавитьсяm_
от ваших открытых полей, свойств и т. Д., Как это не должно быть там.источник
Я думаю, что это помогает вам. пожалуйста, проверьте
источник