我已经制作了两个值的列表。
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中有这么好的方法吗?
答案 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;
});