我如何findList <>中的最后一个元素?

以下是我的代码摘录:

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

我想find最后一个元素,以便将cnt3等同于我的for循环,并打印列表中的所有条目。 列表中的每个元素都是上面代码示例中提到的AllIntegerID类的对象。 如何find列表中的最后一个有效条目?

我应该使用像integerList.Find(integerList []。m_MessageText == null;

如果我使用它将需要一个范围从0到任何最大值的索引。 意味着我将不得不使用另一个循环,我不打算使用。 有一个更短/更好的方法?

谢谢你,Viren

如果你只想访问列表中的最后一项,你可以做

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

要获得列表中项目的总数,您可以使用“计数”选项

 var itemCount = integerList.Count; 

要获取集合的最后一个项目,请使用LastOrDefault()Last()扩展方法

 var lastItem = integerList.LastOrDefault(); 

要么

 var lastItem = integerList.Last(); 

记住添加using System.Linq; ,否则这种方法将不可用。

让我们来看看问题的根源,如何安全地处理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)。 这个函数从列表的末尾开始,所以尽pipe方法通常是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方法很难看,但只需要声明一个地方。 如果列表为空,它将返回列表types“”的默认构造值作为string。 将alwaysTrue委托更进一步,使其成为模板而不是stringtypes,将会更有用。

更改

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

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

尝试使用For Each而不是For For列表。 这会容易很多。

为什么不使用List上的Count属性呢?

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

使用Count属性。 最后一个索引将是Count - 1

 for (int cnt3 = 0 ; cnt3 < integerList.Count; cnt3++) 
 int lastInt = integerList[integerList.Count-1]; 

我不得不同意一个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); } 

另外我build议你添加属性来访问你的信息,而不是公共字段,这取决于你的.net版本,你可以像public int MessageType {get; set;} public int MessageType {get; set;}并摆脱m_从你的公共领域,属性等,因为它不应该在那里。

与原始问题无关,如果您捕获对局部variables的引用而不是多次索引到列表中,则会获得更好的性能:

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