2010-09-30 13 views
6

meine aktuelle Erweiterungsmethode Gegeben:Wiederholen LINQ Abfrage

public static List<char> rotate(this List<char> currentList, int periodes) { 
    if (periodes != 1) { 
     int x = currentList.Count() - 1; 
     return rotate(currentList.Skip(x). 
      Concat(currentList.Take(x)).ToList<char>(), periodes - 1); 
    } 
    return currentList; 
} 

Original-Zustand:

ring = new List<char>() { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; 

Aktuell Ergebnis für ring.rotate(10);

J A B C D E F G H I 
I J A B C D E F G H 
H I J A B C D E F G 
G H I J A B C D E F 
F G H I J A B C D E  Recursive Steps 
E F G H I J A B C D 
D E F G H I J A B C 
C D E F G H I J A B 
B C D E F G H I J A 

A B C D E F G H I J  Result 

Gibt es eine Möglichkeit, diese While-Schleife loszuwerden und die Wiederholung in die LINQ-Abfrage zu integrieren?

Beste
Henrik

+0

gut .. Ihre Ergebnisse sollten richtig sein .. Rotierende 10 Elemente 10 mal führen sollte im ursprünglichen Zustand. –

+0

Was ist GesamtRing? Ist es "A B C D E F G H I J" oder ist das das Ergebnis nach 1 Umdrehung? – dtb

+0

hat den ursprünglichen Wert von Ring hinzugefügt. –

Antwort

3

überspringen i und concat i

public static class Ex 
{ 
    public static List<char> Rotate(this List<char> c, int i) 
    { 
     i %= c.Count; 
     return c.Skip(i).Concat(c.Take(i)).ToList(); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     List<char> chars = new List<char>(); 

     for (int i = 65; i < 75; ++i) 
     { 
      chars.Add((char)i); 
     } 

     var r1 = chars.Rotate(10); // A B C D E F G H I J 
     var r2 = chars.Rotate(1); // B C D E F G H I J A 
     var r3 = chars.Rotate(101); // B C D E F G H I J A 
     var r4 = chars.Rotate(102); // C D E F G H I J A B 

     Console.ReadLine(); 
    } 
} 
+1

Richtig und sehr elegant! Ich mag das. –

+0

Es gibt keine Notwendigkeit für die ternäre Bedingung. 'i% = c.Count;' gibt den gleichen Wert an. Ich vermute, der Leistungsunterschied ist winzig, aber die Lesbarkeitsverbesserung ist ziemlich hoch. – dss539

3

Dies sollte die gleiche wie Ihre ursprüngliche Lösung produzieren und kompensiert die -1 Ausgabe:

public static List<char> rotate2(this List<char> currentList, int periodes) 
{ 
    int start = (currentList.Count - periodes) + 1; 
    return currentList.Skip(start).Concat(currentList.Take(start)).ToList(); 
} 

bearbeiten

ich dies in eine Konsole gelegt haben app, die Ergebnisse sehen für mich gleich aus

class Program 
{ 
    static void Main(string[] args) 
    { 

     List<char> s = "ABCDEFGHIJ".ToList(); 

     for (int x = 0; x < 10; x++) 
     { 
      s.rotate(x+ 1).ForEach(Console.Write); 
      Console.WriteLine(); 
     } 
     Console.WriteLine(); 
     for (int x = 0; x < 10; x++) 
     { 
      s.rotate2(x + 1).ForEach(Console.Write); 
      Console.WriteLine(); 
     } 

     Console.ReadLine(); 
    } 
} 

static class so 
{ 
    public static List<char> rotate(this List<char> currentList, int periodes) 
    { 
     while (periodes != 1) 
     { 
      int x = currentList.Count() - 1; 
      return rotate(currentList.Skip(x). 
        Concat(currentList.Take(x)).ToList<char>(), periodes - 1); 
     } 
     return currentList; 
    } 

    public static List<char> rotate2(this List<char> currentList, int periodes) 
    { 
     int start = (currentList.Count - periodes) + 1; 
     return currentList.Skip(start).Concat(currentList.Take(start)).ToList(); 
    } 
} 
+0

Hmm, danke, aber das erfordert immer noch eine Art Schleife. –

+0

Sie wollen also die Ausgabe _entire_ des Rasters und nicht nur das Ergebnis einer Erweiterungsmethode? Das war nicht klar aus der Frage – amarsuperstar

+0

Nein, ich will nur das Ergebnis. Entschuldigung, wenn ich das nicht klar gemacht habe. –

1

das Konsolenprogramm vollständig mit Linq zu schreiben, wie etwa:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var ring = Enumerable.Range(97, 10).Select(x => (char)x).ToList(); 

     Console.WriteLine(string.Join("\n", Enumerable.Range(1, 10).Select(x => new string(ring.rotate(x).ToArray())))); 

     Console.ReadLine(); 
    } 
}