按顺序访问使用LINQ的.Skip()跳过的项目

时间:2017-04-18 13:48:32

标签: c# linq

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)跳过的项目上设置该怎么办?

3 个答案:

答案 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;
}