6 Stimmen

LINQ-Abfrage wiederholen

Angesichts meiner derzeitigen Verlängerungsmethode:

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

Ursprünglicher Zustand:

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

Aktuelles 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 eine Möglichkeit, die Wiederholung in die LINQ-Abfrage zu integrieren?

Am besten
Henrik

3voto

amarsuperstar Punkte 1773

Dies sollte zu demselben Ergebnis führen wie Ihre ursprüngliche Lösung und kompensiert das -1-Problem:

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

Modifier

Ich habe dies in eine Konsolenanwendung eingegeben, 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();
    }
}

3voto

BrunoLM Punkte 93432

Überspringen i und konkaten 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();
    }
}

1voto

FacticiusVir Punkte 2017

Um das Konsolenprogramm komplett mit Linq zu schreiben, wie wäre es mit:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X