foreach(var item in items.Where(x => x.SomeCondition == true).Skip(1))
{
item.OneThing = true;
item.AnotherThing = true;
}
对于使用item
跳过的.Skip(1)
,我还需要将.AnotherThing
设置为true
。我可以在没有.Skip(1)
的情况下迭代所有内容并将.AnotherThing
设置为true
,然后使用.Skip(1)
迭代所有内容并将.OneThing
设置为true
。有没有更优雅的方法来做到这一点,而不是循环遍历集合两次?
修改:如果有.YetAnotherThing
属性,需要在使用.Skip(1)
跳过的项目上设置该怎么办?
答案 0 :(得分:4)
听起来你不想在这种情况下使用Skip
。只需使用局部变量来记住这是否是第一次迭代。
bool firstItem = true;
foreach(var item in items.Where(x => x.SomeCondition))
{
item.AnotherThing = true;
if (!firstItem)
{
item.OneThing = true;
}
firstItem = false;
}
答案 1 :(得分:1)
请勿在{{1}}循环中使用Skip(1)
。您还可以执行foreach
以将索引作为第二个参数。
Select
当然,在实际代码中,请选择比创建foreach (var item in items.Where(x => x.SomeCondition)
.Select((x, i) => new { item = x, index = i })
{
// If you have a lot to do:
if (item.index != 0)
{
item.item.YetAnotherThing = 15;
item.item.OneThing = true;
}
// If you have a simple boolean
item.item.OneThing = item.index != 0;
// Something that will always happen.
item.item.AnotherThing = true;
}
更好的变量名。
答案 2 :(得分:-1)
怎么样
var newItems = items.Where(x => x.SomeCondition == true).ToList();
if(newItems.Count != 0)
{
newItems.ForEach(i => i.AnotherThing = true);
newItems.FirstOrDefault().OneThing = true;
}