tags:

views:

116

answers:

3
+6  Q: 

Repeat LINQ Query

Given my current extension method:

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 State:

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

Current Result for 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

Is there any way to get rid of this while loop and any chance to integrate the repetition into the LINQ query?

Best
Henrik

+3  A: 

This should produce the same as your original solution and compensates for the -1 issue:

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

Edit

I have put this into a console app, the results look the same to me

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();
    }
}
amarsuperstar
Hmm, thanks, but this still require some kind of loop.
Henrik P. Hessel
So you want the _entire_ output of the grid, and not just the result of one extension method? That was not clear from the question
amarsuperstar
No, I just want the result. Sorry, if I didn't made that clear.
Henrik P. Hessel
Both answers are correct.
Henrik P. Hessel
+3  A: 

Skip i and concat i

public static class Ex
{
    public static List<char> Rotate(this List<char> c, int i)
    {
        i = c.Count < i ? i % c.Count : i;
        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();
    }
}
BrunoLM
Correct and very elegant! I like it.
Henrik P. Hessel
+1  A: 

To write the console program completely with Linq, how about:

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