A seguir, um extrato do meu código:
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;
}
Estou tentando usar o seguinte no meu código de função 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;
}
O problema está aqui: estou tentando imprimir todos os elementos da minha lista usando um loop 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);
}
Eu quero encontrar o último elemento para que eu iguale cnt3 no meu loop for e imprima todas as entradas na lista. Cada elemento da lista é um objeto da classe AllIntegerIDs, conforme mencionado acima no exemplo de código. Como encontro a última entrada válida na lista?
Devo usar algo como integerList.Find (integerList []. M_MessageText == null;
Se eu usar isso, será necessário um índice que varia de 0 a qualquer valor máximo. Significa que terei que usar outro loop for que não pretendo usar. Existe uma maneira mais curta / melhor?
Obrigado, Viren
AllIntegerIDs newItem = new AllIntegerID();
use isso para atribuir todos os campos e depois ligueintegerList.Add(newItem)
. Ou use propriedades em vez de campos e use a sintaxe do inicializador de objetos do C # 3.0.Respostas:
Se você quiser apenas acessar o último item da lista, pode fazer
para obter o número total de itens na lista, você pode usar a propriedade Count
fonte
Last
/LastOrDefault
conforme mencionado abaixo.Enumerable.Last
lançará uma exceção se a lista estiver vazia. Se você chamarEnumerable.LastOrDefault
e passar uma lista de tipos de valor, o valor padrão será retornado se a lista estiver vazia. Portanto, se você receber 0 de volta de umList<int>
, não saberá se a lista estava vazia ou se o último valor foi 0. Em resumo, você precisa verificar oCount
mecanismo de recuperação que decidir usar.var element = list[list.Count - 1]
é muito sucinta e legível. Não há necessidade de invocar métodos de extensãoPara obter o último item de uma coleção, use os métodos de extensão LastOrDefault () e Last ()
OU
Lembre-se de adicionar
using System.Linq;
ou esse método não estará disponível.fonte
First
,FirstOrDefault
,Last
,LastOrDefault
,Single
,SingleOrDefault
,ElementAt
eElementAtOrDefault
são otimizados paraIList<TSource>
,Count
eContains
são otimizados paraICollection<TSource>
eCast<TResult>
é otimizado paraIEnumerable<TResult>
.using System.Linq;
System.Linq.Enumerable
não são realmente 'otimizados'. Aqui está o código para oEnumerable.Last
métodoSystem.Linq.Enumerable.Last
, eu concordo com 0b101010 - oLast()
código não é "otimizado paraList<>
s" -Last()
é apenas um invólucro feio, cujo padrão éreturn list[list.Count-1]
no caso do argumento é umIList
, e itera sobre a lista até o fim no caso não é ... tornando-a uma solução muito ruim seIList
for aLinkedList
, pois o indexador passará por toda a lista desnecessariamente (não encontrei uma substituição repetindo oItem[]
índice> Count / 2 nas fontes c #, YMMV )Vamos chegar à raiz da questão, como abordar o último elemento de uma lista com segurança ...
Assumindo
Então
"contagem 1" é um mau hábito, a menos que você primeiro garanta que a lista não esteja vazia.
Não há uma maneira conveniente de verificar a lista vazia, exceto para fazê-lo.
A maneira mais curta que consigo pensar é
você pode fazer tudo e criar um delegado que sempre retorna true e passá-lo para FindLast, que retornará o último valor (ou valor construído padrão, se a lista estiver vazia). Esta função começa no final da lista, então será Big O (1) ou tempo constante, apesar do método normalmente ser O (n).
O método FindLast é feio se você contar a parte do delegado, mas ele precisa ser declarado apenas um local. Se a lista estiver vazia, ele retornará um valor construído padrão do tipo de lista "" para string. Levar o delegado alwaysTrue um passo adiante, tornando-o um modelo em vez do tipo de string, seria mais útil.
fonte
myList.FindLast(_unused_variable_name => true);
Isso funcionará independentemente do tipo. É uma versão mais curtamyList.FindLast(_ => true);
, mas acho que apenas o sublinhado (ou qualquer outro identificador de caractere único) pode ser um pouco confuso às vezes.fonte
mudança
para
fonte
Use a
Count
propriedade O último índice seráCount - 1
.fonte
Você pode encontrá-lo contando primeiro o número de elementos na lista, por exemplo
Então você pode indexar a contagem - 1 para obter o último elemento da lista, por exemplo
fonte
No C # 8.0, você pode obter o último item com a explicação completa do operador ^
fonte
Por que não usar apenas a propriedade Count na lista?
fonte
Independentemente da sua pergunta original, você obterá melhor desempenho se capturar referências a variáveis locais em vez de indexar na sua lista várias vezes:
E no seu
for
loop:fonte
Eu teria que concordar que um foreach seria muito mais fácil, algo como
Além disso, eu sugiro que você adicione propriedades para acessar suas informações em vez de campos públicos, dependendo da sua versão .net, você pode adicioná-las como
public int MessageType {get; set;}
e se livrar dosm_
campos públicos, propriedades etc., pois ela não deveria estar lá.fonte
Eu acho que isso ajuda você. por favor, verifique
fonte