以下是我的代码摘录:
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);
}
我想找到最后一个元素,以便在我的for循环中将cnt3等同并打印出List中的所有条目。列表中的每个元素都是AllIntegerIDs类的对象,如上面代码示例中所述。如何在列表中找到最后一个有效条目?
我应该使用类似integerList.Find(integerList []的东西.m_MessageText == null;
如果我使用它,它将需要一个范围从0到任何最大值的索引。意味着我将不得不使用另一个for循环,我不打算使用它。是否有更短/更好的方式?
谢谢, Viren
答案 0 :(得分:225)
要获取集合的最后一项,请使用 LastOrDefault() 和 Last() 扩展方法
var lastItem = integerList.LastOrDefault();
OR
var lastItem = integerList.Last();
记得添加using System.Linq;
,否则此方法将无法使用。
答案 1 :(得分:174)
如果您只想访问列表中的最后一项,则可以
var item = integerList[integerList.Count - 1];
要获取列表中的项目总数,您可以使用Count propery
var itemCount = integerList.Count;
答案 2 :(得分:16)
让我们深入了解问题的根源,如何安全地解决List的最后一个元素......
假设
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(n),也将为Big O(1)或常数时间。
//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方法很难看,但只需将其声明为一个地方。如果列表为空,它将为字符串返回列表类型“”的默认构造值。将alwaysTrue委托更进一步,使其成为模板而不是字符串类型,将更有用。
答案 3 :(得分:9)
在C#8.0中,您可以使用^运算符full explanation
获得最后一项List<char> list = ...;
var value = list[^1];
// Gets translated to
var value = list[list.Count - 1];
答案 4 :(得分:4)
更改
for (int cnt3 = 0 ; cnt3 <= integerList.FindLastIndex ; cnt3++)
到
for (int cnt3 = 0 ; cnt3 < integerList.Count; cnt3++)
答案 5 :(得分:3)
尝试使用For Each而不是For for列表。这会容易得多。
答案 6 :(得分:3)
int lastInt = integerList[integerList.Count-1];
答案 7 :(得分:2)
为什么不在List上使用Count属性?
for(int cnt3 = 0; cnt3 < integerList.Count; cnt3++)
答案 8 :(得分:2)
使用Count
属性。最后一个索引是Count - 1
。
for (int cnt3 = 0 ; cnt3 < integerList.Count; cnt3++)
答案 9 :(得分:2)
您可以通过首先计算列表中的元素数量来找到它,例如
int count = list.Count();
然后你可以索引count - 1来获取列表中的最后一个元素,例如
int lastNumber = list[count - 1];
答案 10 :(得分:1)
尽管这是11年前发布的,但我敢肯定,正确的答案要比答案还要多!
您也可以做类似的事情;
if (integerList.Count > 0)
var item = integerList[^1];
几个月前,请参阅MS C#文档here上的教程文章。
我个人仍然会坚持使用LastOrDefault()
/ Last()
,但我想与大家分享。
编辑; 刚刚意识到另一个答案已经通过另一个文档链接提到了这一点。
答案 11 :(得分:0)
我不得不同意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_
,属性等,因为它不应该在那里。
答案 12 :(得分:0)
独立于原始问题,如果您捕获对局部变量的引用而不是多次索引到列表中,您将获得更好的性能:
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);
}
答案 13 :(得分:0)
我认为这对您有帮助。请检查
TaxRangers[TaxRangers.Count]. max