【发布时间】:2011-04-02 23:21:43
【问题描述】:
假设我有一个foreach 循环。
我必须对循环的第一个对象做一些与其他任何对象无关的事情。
如何检查当前循环中的项目是否是第一个对象。
【问题讨论】:
假设我有一个foreach 循环。
我必须对循环的第一个对象做一些与其他任何对象无关的事情。
如何检查当前循环中的项目是否是第一个对象。
【问题讨论】:
有几种方法可以做到这一点。
for 循环list.First(),然后通过 list.Skip(1) 获取 foreach
【讨论】:
在我看来这是最简单的方法
foreach (var item in list)
{
if((list.IndexOf(item) == 0)
{
// first
}
// others
}
【讨论】:
IEnumerable,则复杂度在 O(n) 之内,这在每次迭代中都会执行很多开销。
我喜欢 Linq 方式,但没有 Skip(1),这样您也可以将它用于列表中的最后一项,并且您的代码保持干净恕我直言 :)
foreach(var item in items)
{
if (items.First()==item)
item.firstStuff();
else if (items.Last() == item)
item.lastStuff();
item.otherStuff();
}
【讨论】:
这更像是获取数组中每个对象的索引的通用解决方案。如果是第一个,应该进行测试。
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);
}
在此设置中,KeyValuePair 的键是索引,值是该索引处的对象,在我的示例中是字符串,但任何对象都可以放置在那里。它增加了一点开销,但可用于在需要时确定列表索引中的任何对象。
【讨论】:
这是一个高效的解决方案:
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 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;
}
【讨论】:
bool first = true;
foreach(var foo in bar)
{
if (first)
{
// do something to your first item
first = false;
}
// do something else to the rest
}
【讨论】:
类似这样的:
bool first = true;
foreach(var item in items)
{
if (first)
{
item.firstStuff();
first = false;
}
item.otherStuff();
}
【讨论】: