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 开发者_如何学Go 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
HenrikSkip i
and 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();
}
}
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();
}
}
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();
}
}
精彩评论