重复值Linq

时间:2016-08-01 15:06:43

标签: c# linq

我们说我有一个数字序列:

 2 5 7 8 0 0 0 

我想要以下顺序:

2 5 7 8 8 8 8

那就是:在零之前重复最后一个数字,这可以用Linq完成吗?

提前谢谢

4 个答案:

答案 0 :(得分:5)

一般来说,没有。但你可以写自己的:

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);

答案 1 :(得分:2)

您可以使用.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

答案 2 :(得分:1)

这个答案并没有使用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)
}

答案 3 :(得分:0)

另一种解决方案(不是表现最佳而且没有假设角落情况)

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();