使用符合某个条件的先前值替换列表中的LINQ值

时间:2013-11-21 10:28:53

标签: linq

我已经制作了两个值的列表。

Id Value
10  0 
11  1 
12  2 
13  3 
14 -1 
15 -1 
16  6 
17 -1 
18  8 
19  9 

我希望所有-1值都替换为之前的-1值,以便我最终得到列表

Id Value
10  0 
11  1 
12  2 
13  3 
14  3 
15  3 
16  6 
17  6 
18  8 
19  9 

在LINQ中有这么好的方法吗?

3 个答案:

答案 0 :(得分:2)

如果您需要使用LINQ访问以前的元素,则循环可能更合适(可读,高效)。

但是(Obj是你的班级):

list = list.Select((x, index) => 
{
    if (index != 0 && x.Value == -1)
    {
        x.Value = list.Take(index)
            .Where(xPrev => xPrev.Value != -1)
            .Select(xPrev => xPrev.Value)
            .DefaultIfEmpty(int.MinValue)
            .Last();
    }
    return x;
}).ToList();

请注意,这并不能确保您获得的值与-1不同,因为我只是选择了之前的值。

答案 1 :(得分:1)

为什么不:

var lastValue = -1;
foreach (var item in items)
{
    if (item.Value == -1)
    {
        item.Value = lastValue;
    }
    else
    {
        lastValue = item.Value;
    }
}

答案 2 :(得分:0)

另一种变体 - 像这样使用聚合扩展

list = list.Aggregate(new List<YourObjectClass>(), (a, b) =>
    {
        if (b.Value == -1 && a.Count>0)
            b.Value = a.Last().Value;

        a.Add(b);
        return a;
    });