假设我有一个foreach
循环。
我必须对循环的第一个对象执行某些操作,而其他对象则不需要这样做。
如何检查当前在循环中的项是否为第一个对象。
我喜欢使用Linq的方式,但是不使用Skip(1)的话,你也可以用它来获取列表中的最后一个项目,并且你的代码仍然保持简洁。
foreach(var item in items)
{
if (items.First()==item)
item.firstStuff();
else if (items.Last() == item)
item.lastStuff();
item.otherStuff();
}
你可以采取以下几种方式来实现。
for
循环替代。list.First()
,然后在 list.Skip(1)
上使用 foreach
。像这样:
bool first = true;
foreach(var item in items)
{
if (first)
{
item.firstStuff();
first = false;
}
item.otherStuff();
}
以下是高效的解决方案:
using (var erator = enumerable.GetEnumerator())
{
if (erator.MoveNext())
{
DoActionOnFirst(erator.Current);
while (erator.MoveNext())
DoActionOnOther(erator.Current);
}
}
编辑:这里还有一个 LINQ 的:
if (enumerable.Any())
{
DoActionOnFirst(enumerable.First());
foreach (var item in enumerable.Skip(1))
DoActionOnOther(item);
}
编辑:如果对于项目的操作具有可分配给 Func<TItem, TResult>
的签名,则可以执行以下操作:
enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));
bool first = true;
foreach(var foo in bar)
{
if (first)
{
// do something to your first item
first = false;
}
// do something else to the rest
}
foreach (var item in list)
{
if((list.IndexOf(item) == 0)
{
// first
}
// others
}
试试这个
bool IsFirst = true;
foreach(DataRow dr in dt.Rows)
{
if (IsFirst)
{
// do some thing
IsFirst = false;
}
}
我除了这个之外什么都想不到。
var processedFirst = false;
foreach(var x in items) {
if(!processedFirst) {
ProcessFirst(x);
processedFirst = true;
}
这是一个通用的解决方案,可以获取数组中每个对象的索引。如果需要测试是否为第一个,应该能够正常工作。
List<String> entries = new List<string>();
entries.Add("zero");
entries.Add("one");
entries.Add("two");
Dictionary<int, String> numberedEntries = new Dictionary<int, string>();
int i = 0;
entries.ForEach(x => numberedEntries.Add(i++, x));
foreach (KeyValuePair<int, String> pair in numberedEntries) {
Console.WriteLine(pair.Key + ": " + pair.Value);
}
您也可以这样写:
foreach ((T item, bool isFirst) in items.Select((item, index) => (item, index == 0)))
{
if (isFirst)
{
...
}
else
{
...
}
}