C# 重复值Linq

C# 重复值Linq,c#,linq,C#,Linq,假设我有一个数字序列: 2 5 7 8 0 0 0 2 5 7 8 8 8 8 我想要以下顺序: 2 5 7 8 0 0 0 2 5 7 8 8 8 8 也就是说:重复零之前的最后一个数字,这可以通过Linq实现吗 提前感谢您此答案不使用LINQ,但获得相同的结果 var originalCollection = [ 2, 5, 7, 8, 0, 0, 0 ].ToList(); int removeCount = 0; while (originalCollection[or

假设我有一个数字序列:

 2 5 7 8 0 0 0 
2 5 7 8 8 8 8
我想要以下顺序:

 2 5 7 8 0 0 0 
2 5 7 8 8 8 8
也就是说:重复零之前的最后一个数字,这可以通过Linq实现吗


提前感谢您

此答案不使用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)
}

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

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;        
        }
    }
}
如果您真的坚持人工引入LinQ方法,您可以采用上面的循环并将其构建到select中:

  var numbers = new int[] { 2, 5, 7, 8, 0, 0, 0 };

  int last = 0;
  var result = numbers.Select(n => n == 0 ? last : last = n);
另一种解决方案(不是性能最佳的解决方案,也不假设出现拐弯情况)


使用LINQ,您可以使用
.Aggregate()
方法来实现这一点:

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

在序列的中间可以有零点吗?是的,零点可以在中间。这几乎与LINQ无关。使用LINQ的唯一位置是
.Count()
。即使这样,您也应该使用
列表
的更有效的
.Count
属性。当然,但谁在乎呢?它是有效的,LINQ真的不需要。我明白,当人们说他们“想使用LINQ/jQuery”时,他们的意图是善意的,但为什么不使用普通语言呢?@NickBull我想OP会在乎,因为这是他要求的。@DrewKennedy,意图也可以是善意的!如果香草语言实现了功能,为什么他需要在香草语言上使用它呢?@DrewKennedy当然,更新已经完成。“dumped”(我可以说,也是手工编写的)代码回答了这个问题——如果我问这个问题,我会说这很有帮助。它是
IEnumerable
的一种扩展方法,就像LinQ一样。如果解决方案生成扩展方法,并不意味着它使用LinQ:)它不使用LinQ。读第一句话。显然,您可以人为地引入LinQ,但这是毫无意义的。相反,这是一个看起来像LinQ,听起来像LinQ的东西。就像我们说的那样。@tym32167添加了一点“真实的”LinQ:)我认为它不如扩展方法好。
2 5 7 8 8 8 8