Repeat values Linq
本文关键字:Linq values Repeat | 更新日期: 2023-09-27 17:59:46
假设我有一个数字序列:
2 5 7 8 0 0 0
我想要以下顺序:
2 5 7 8 8 8 8
也就是:重复最后一个数字在零之前,这可以用Linq完成吗?
提前感谢
一般来说,没有。但你可以自己写:
public static class SomeExtension
{
public static IEnumerable<T> ReplaceDefaultByPreviousNonDefault(this IEnumerable<T> sequence)
{
T previous = default(T);
foreach(var val in squence)
{
if(val == default(t)) yield return previous;
previous = val;
yield return val;
}
}
}
示例用法:
var numbers = new int[] { 2, 5, 7, 8, 0, 0, 0 };
var result = numbers.ReplaceDefaultByPreviousNonDefault();
如果你真的真的坚持人为地引入LinQ方法,你可以采用上面的循环,并将其构建成一个选择:
var numbers = new int[] { 2, 5, 7, 8, 0, 0, 0 };
int last = 0;
var result = numbers.Select(n => n == 0 ? last : last = n);
您可以使用.Aggregate()
方法通过LINQ实现这一点:
int[] numbers = { 2, 5, 7, 8, 0, 0, 0 };
Console.WriteLine(string.Join(" ", numbers
.Aggregate(new List<int>(), (l, n) =>
{
l.Add(n == 0 ? l.Last() : n);
return l;
})));
我得到:
2 5 7 8 8 8 8
这个答案不使用LINQ,但可以获得相同的结果。
var originalCollection = [ 2, 5, 7, 8, 0, 0, 0 ].ToList();
int removeCount = 0;
while (originalCollection[originalCollection.Count - 1] == 0) {
removeCount++;
}
originalCollection.RemoveRange( (originalCollection - removeCount - 1), (originalCollection - 1) );
var finalElement = originalCollection[originalCollection.Count - 1];
for (int i = removeCount; i > 0; i--) {
originalCollection.Add(finalElement)
}
另一个解决方案(不是性能最佳的解决方案,也没有假设拐角情况)
var data = new[] {0 ,0 , 2, 5, 7, 8, 0, 0, 0, 7, 7, 7, 9, 0, 0, 7, 0, 0 };
var rezult = data.Select((x,i)=>x == 0 ? data.Take(i).LastOrDefault(z=>z!=0) :x).ToArray();