2016-08-01 10 views
-2

Lassen Sie uns sagen, dass ich eine Zahlen-Sequenz haben:Repeat Werte Linq

2 5 7 8 0 0 0 

Und ich möchte die folgende Sequenz:

2 5 7 8 8 8 8 

Das heißt: wiederholen Sie die letzte Nummer vor Nullen, kann dies mit durchgeführt werden Linq?

Vielen Dank im Voraus

+1

Kann es in der Mitte sein Nullen der Sequenz? –

+0

Ja, Nullen können in der Mitte sein. –

Antwort

5

Allgemein gesagt, nein. Aber Sie können Ihre eigenen schreiben:

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

Beispiel Nutzung:

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

var result = numbers.ReplaceDefaultByPreviousNonDefault(); 

Wenn Sie wirklich wirklich wirklich beharren auf künstlich ein LinQ Verfahren einzuführen, können Sie die obige Schleife zu nehmen und es einfach bauen in eine 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); 
+2

das ist eine gute antwort, buut .... wo die linq hier? : D – tym32167

+0

Nun, es ist eine Erweiterung Methode für IEnumerable 'genau wie LinQ. – nvoigt

+1

Wenn die Lösung eine Erweiterungsmethode erzeugt, heißt das nicht, dass sie Linq verwendet :) – tym32167

1

Diese Antwort nicht LINQ verwendet, sondern erreicht das gleiche Ergebnis.

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) 
} 
+1

Das hat mit LINQ fast nichts zu tun. Der einzige Ort, an dem Sie LINQ verwenden, ist '.Count()'. Und selbst dann sollten Sie die effizientere '.Count' -Eigenschaft von' List 'verwenden. – itsme86

+3

Sicher, aber wen interessiert das? Es funktioniert und LINQ wird wirklich nicht benötigt. Ich bekomme das, wenn Leute sagen, dass sie "LINQ/jQuery" benutzen wollen, ihre Absichten gut gemeint sind, aber warum nicht die Vanille-Sprache verwenden? –

+0

@NickBull Ich denke, das OP kümmert sich darum, da er danach gefragt hat. –

0

eine andere Lösung (kein am besten durch Leistung und ohne Eckfällen vorausgesetzt) ​​

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

Sie können dies mit LINQ erreichen die .Aggregate() Methode:

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

ich:

2 5 7 8 8 8 8