有没有一种奇特的方法可以知道你在List中的最后一个循环中而不使用计数器
List<string> myList = new List<string>() {"are", "we", "there", "yet"};
foreach(string myString in myList) {
// Is there a fancy way to find out here if this is the last time through?
}
答案 0 :(得分:9)
不,你必须使用常规的for(int i=0; i<myList.Length; i++) { ... }
循环。
答案 1 :(得分:4)
如何使用for循环呢?
List<string> myList = new List<string>() {"are", "we", "there", "yet"};
for (var i=0; i<myList.Count; i++)
{
var myString = myList[i];
if (i==myList.Count-1)
{
// this is the last item in the list
}
}
foreach
很有用 - 但是如果你需要计算你正在做的事情,或者按计数索引事物,那么只需要恢复到一个好的旧for
循环。
答案 2 :(得分:3)
我有两种方法可以做到。
首先,使用for
循环代替foreach
for(int i = 0; i < myList.Count; i++)
{
string myString = myList[i];
bool isLast = i == myList.Count - 1;
...
}
或者,如果这需要与枚举器一起使用,请更改事物的顺序。通常MoveNext
作为while循环的控件完成,但是如果我们在循环开始时就这样做,我们可以使用它的返回来确定我们是否在列表的末尾。 / p>
IEnumerator<string> enumerator = myList.GetEnumerator();
bool isLast = !enumerator.MoveNext();
while(!isLast)
{
string myString = enumerator.Current;
isLast = !enumerator.MoveNext();
...
}
答案 3 :(得分:1)
没有有效的方法可以做到这一点。
只需使用for
循环和索引。它以任何方式运行得更快。
答案 4 :(得分:0)
不,没有,如果您想使用foreach
,则必须使用计数器。
答案 5 :(得分:0)
使用for
运算符代替foreach
答案 6 :(得分:0)
嗯......没有办法知道这一点。不像你猜的那么容易。列表数据结构只是一个接一个地订购商品的方式。但是你没有办法说明一个项目是否只是使用foreach结构的最后一项。最好使用带有count属性的结构来知道你是否击中了最后一个(或前一个)项目。
var length = list.Count;
for (var idx = 0; idx < list.Count; idx++)
{
if (idx == (length - 1))
{
// The last item. Do something
}
}
希望它有所帮助。
答案 7 :(得分:0)
“花哨”的方式是保持1个元素的前瞻,但为什么你想要? Jus保持统计。这是奇特的方式。没有计数器,也没有检查Count属性。它使用的只是一个枚举器:
using System;
using System.Collections.Generic;
namespace Sandbox
{
class Program
{
enum ListPosition : byte
{
First = 0x01 ,
Only = First|Last ,
Middle = 0x02 ,
Last = 0x04 ,
Exhausted = 0x00 ,
}
private static void WalkList( List<int> numbers )
{
List<int>.Enumerator numberWalker = numbers.GetEnumerator();
bool currFetched = numberWalker.MoveNext();
int currValue = currFetched ? numberWalker.Current : default( int );
bool nextFetched = numberWalker.MoveNext();
int nextValue = nextFetched ? numberWalker.Current : default( int );
ListPosition position ;
if ( currFetched && nextFetched ) position = ListPosition.First ;
else if ( currFetched && ! nextFetched ) position = ListPosition.Only ;
else if ( ! currFetched ) position = ListPosition.Exhausted ;
else throw new InvalidOperationException( "Reached Unreachable Code. Hmmm...that doesn't seem quite right" );
while ( position != ListPosition.Exhausted )
{
string article = ( position==ListPosition.Middle?"a":"the" );
Console.WriteLine( " {0} is {1} {2} item in the list" , currValue , article , position );
currFetched = nextFetched ;
currValue = nextValue ;
nextFetched = numberWalker.MoveNext() ;
nextValue = nextFetched?numberWalker.Current:default( int ) ;
if ( currFetched && nextFetched ) position = ListPosition.Middle ;
else if ( currFetched && ! nextFetched ) position = ListPosition.Last ;
else if ( ! currFetched ) position = ListPosition.Exhausted ;
else throw new InvalidOperationException( "Reached Unreachable Code. Hmmm...that doesn't seem quite right" );
}
Console.WriteLine() ;
return ;
}
static void Main( string[] args )
{
List<int> list1 = new List<int>( new []{ 1 , } ) ;
List<int> list2 = new List<int>( new []{ 1 , 2 , } ) ;
List<int> list3 = new List<int>( new []{ 1 , 2 , 3 , } ) ;
List<int> list4 = new List<int>( new []{ 1 , 2 , 3 , 4 , } ) ;
Console.WriteLine( "List 1:" ) ; WalkList( list1 ) ;
Console.WriteLine( "List 2:" ) ; WalkList( list2 ) ;
Console.WriteLine( "List 3:" ) ; WalkList( list3 ) ;
Console.WriteLine( "List 4:" ) ; WalkList( list4 ) ;
return ;
}
}
}
答案 8 :(得分:0)
取决于您对“幻想”的定义。这可能符合以下条件:
if (myList.Count > 0)
{
myList.Take(myList.Count - 1)).ForEach(myString => doSomething(myString));
doSomethingElse(myList.Last());
}
对我而言,这似乎与您所寻找的相近。请注意,它不是超高性能,但它很短且非常易读,至少在我看来。你也可以这样写:
if (myList.Count > 0)
{
foreach (string myString in myList.Take(myList.Count - 1))
{
doSomething(myString);
}
doSomethingElse(myList.Last());
}
这是另一种选择,我认为最明显,但它可能是最快的方式:
if (myList.Count > 0)
{
for (int i = 0; i < myList.Count - 1; i++)
{
doSomething(myList[i]);
}
doSomethingElse(myList.Count - 1);
}