2010-09-30 29 views
6

Với phương pháp khuyến nông hiện tại của tôi:Lặp lại LINQ Query

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

gốc Nhà nước:

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

Kết quả hiện tại cho 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 

Có cách nào để loại bỏ điều này trong khi vòng lặp và bất kỳ cơ hội để tích hợp sự lặp lại vào truy vấn LINQ?

nhất
Henrik

+0

tốt .. kết quả của bạn nên được quyền .. Rotating 10 yếu tố gấp 10 lần nên kết quả trong trạng thái ban đầu. –

+0

'gesamtRing' là gì? Có phải nó là "A B C D E F G H I J' hay là kết quả sau 1 vòng quay? – dtb

+0

đã thêm giá trị ban đầu của vòng. –

Trả lời

3

Bỏ qua i và 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

Chính xác và rất thanh lịch! Tôi thích nó. –

+0

Không cần thiết phải có điều kiện bậc ba. 'i% = c.Count;' cho cùng một giá trị. Tôi nghi ngờ sự khác biệt hiệu suất là rất nhỏ, nhưng sự cải thiện khả năng đọc là khá cao. – dss539

3

này nên sản xuất giống như giải pháp ban đầu của bạn và đền bù cho sự -1 vấn đề:

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

Sửa

Tôi đã đưa điều này vào một giao diện điều khiển ứng dụng, kết quả trông giống như tôi

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, cảm ơn, nhưng điều này vẫn yêu cầu một số loại vòng lặp. –

+0

Vì vậy, bạn muốn đầu ra _entire_ của lưới, và không chỉ là kết quả của một phương pháp mở rộng? Điều đó không rõ ràng từ câu hỏi – amarsuperstar

+0

Không, tôi chỉ muốn kết quả. Xin lỗi, nếu tôi không nói rõ. –

1

Để viết chương trình giao diện điều khiển hoàn toàn với LINQ, làm thế nào về:

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(); 
    } 
} 
Các vấn đề liên quan