2015-11-14 2 views
3

Я хочу сделать что-то подобное, но в C#:Распечатайте список, как Матрица

for element in [self.squares[i:i + 3] for i in range(0, len(self.squares), 3)]: // this is in python. 

в результате на выходе будет выглядеть так:

[0,0,0] 
[0,0,0] 
[0,0,0] 

, как я могу это сделать, но в C#? Я знаю, что лучше с матрицей, но я хочу представить плату Tic Tac Toe, и я думаю, что лучше это сделать на python, потому что я хочу найти смежность для реализации алгоритма Min-Max.

ответ

3

Вы можете сделать это простым способом

public static void Print(int[][] matrix) 
{ 
    foreach (var row in matrix) 
     Console.WriteLine($"[{string.Join(",", row)}]"); 
} 

и другой вариант, если у вас есть список, который его длина составляет 9 (данные Tic Tac Toe возможно)

public static void PrintMatrix(List<int> tictactoe) 
{ 
    for (int i = 0; i < 3; i = i + 3) 
     Console.WriteLine($"[{tictactoe[i]},{tictactoe[i + 1]},{tictactoe[i + 2]}]"); 
} 
+0

О, боже, что они сделали с C# - вы передаете фактический код в виде строки. – Croll

+1

@Joker Это называется [интерполяция строк] (https://msdn.microsoft.com/en-us/library/dn961160.aspx). –

+0

дорогой понижитель, позаботьтесь прокомментировать? – dotctor

1

Я пытался сделать некоторые функции похожи на внешний вид python. Еще кое-что можно сделать, чтобы он выглядел более похожим, но из того, что я вижу до сих пор, было бы связано с некоторыми lambda functions, которые могут быть чуть более убиты здесь. Может протестировать here, если потребуется.

using System; 
using System.Collections.Generic; 

namespace Rextester 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      List<int> matrix = MakeList(0,0,0,0,0,0,0,0,0); 
      foreach(var element in Matrixify(3, matrix)) 
       Console.WriteLine(ArrayToString(element)); 
     } 

     // Used to make list easier... 
     public static List<int> MakeList(params int[] elements) 
     { 
      return new List<int>(elements); 
     } 

     // Used for testing display. 
     public static string ArrayToString(int[] arr) 
     { 
      return "[" + string.Join(",", arr) + "]"; 
     } 

     // Breaks a list into a matrix where delta is the # columns and # rows = len(list)/delta. 
     public static int[][] Matrixify(int delta, List<int> list) 
     { 
      // Get a range of start index points. 
      int[] arr = range(0, len(list), delta); 
      // Used to make the matrix. 
      List<int[]> result = new List<int[]>(); 
      // Chops up into rows. 
      foreach(var i in arr) 
       result.Add(getRow(i, i + delta, list)); 
      // Sends back as an array of arrays (aka matrix). 
      return result.ToArray(); 
     } 

     // Grabs a row of the list passed in. 
     public static int[] getRow(int start, int stop, List<int> list) 
     { 
      return list.GetRange(start, stop - start).ToArray(); 
     } 

     // Works similar to python's len function. 
     public static int len(List<int> list) 
     { 
      return list.Count; 
     } 
     public static int len(int[] list) 
     { 
      return list.Length; 
     } 

     // Works similar to python's range function. 
     public static int[] range(int start, int stop, int step) 
     { 
      int size = stop/step; 
      int[] arr = new int[size]; 
      for(int i = 0; i < size; ++i) 
       arr[i] = start + (i * step); 
      return arr; 
     } 
     public static int[] range(int start, int stop) 
     { 
      return range(start, stop, 1); 
     } 
    } 
} 

Теперь, я думаю, что вы можете не получить желаемый результат, так как в C# примитивных типов данных не передается по ссылке. Таким образом, путь вокруг будет состоять в том, чтобы изменить класс int. Вот то, что может работать для вас:

public class INT 
    { 
     private int _i; 
     public INT()  { _i = 0; } 
     public INT(int i) { _i = i; } 
     // Used to access the _i member. 
     public int self 
     { 
      get {return _i;} 
      set {_i = value;} 
     } 
     // Used to display what is stored inside. 
     public override string ToString() 
     { 
      return _i + ""; 
     } 
    } 

Тогда может иметь измененную версию, чтобы сделать его туда, где вы можете изменить значение в вашей матрице.

using System; 
using System.Collections.Generic; 

namespace Rextester 
{ 
    public class Program 
    { 
     public class INT 
     { 
      private int _i; 
      public INT()  { _i = 0; } 
      public INT(int i) { _i = i; } 
      // Used to access the _i member. 
      public int self 
      { 
       get {return _i;} 
       set {_i = value;} 
      } 
      // Used to display what is stored inside. 
      public override string ToString() 
      { 
       return _i + ""; 
      } 
     } 

     public static void Main(string[] args) 
     { 
      List<INT> matrix = MakeList(9); 
      foreach(var element in Matrixify(3, matrix)) 
       Console.WriteLine(ArrayToString(element)); 
     } 

     // Used to make list easier... 
     public static List<INT> MakeList(int count) 
     { 
      List<INT> list = new List<INT>(); 
      for(int i = 0; i < count; ++i) 
       list.Add(new INT()); 
      return list; 
     } 

     // Used for testing display. 
     public static string ArrayToString(INT[] arr) 
     { 
      return "[" + string.Join<INT>(",", arr) + "]"; 
     } 

     // Breaks a list into a matrix where delta is the # columns and # rows = len(list)/delta. 
     public static INT[][] Matrixify(int delta, List<INT> list) 
     { 
      // Get a range of start index points. 
      int[] arr = range(0, len(list), delta); 
      // Used to make the matrix. 
      List<INT[]> result = new List<INT[]>(); 
      // Chops up into rows. 
      foreach(var i in arr) 
       result.Add(getRow(i, i + delta, list)); 
      // Sends back as an array of arrays (aka matrix). 
      return result.ToArray(); 
     } 

     // Grabs a row of the list passed in. 
     public static INT[] getRow(int start, int stop, List<INT> list) 
     { 
      return list.GetRange(start, stop - start).ToArray(); 
     } 

     // Works similar to python's len function. 
     public static int len(List<INT> list) 
     { 
      return list.Count; 
     } 
     public static int len(List<int> list) 
     { 
      return list.Count; 
     } 
     public static int len(int[] list) 
     { 
      return list.Length; 
     } 

     // Works similar to python's range function. 
     public static int[] range(int start, int stop, int step) 
     { 
      int size = stop/step; 
      int[] arr = new int[size]; 
      for(int i = 0; i < size; ++i) 
       arr[i] = start + (i * step); 
      return arr; 
     } 
     public static int[] range(int start, int stop) 
     { 
      return range(start, stop, 1); 
     } 
    } 
} 

Надеюсь, это поможет в некоторой степени.

+0

благодарим вас за помощь !! –

+0

@ SalvadorMacias Нет проблем. Вы смогли реализовать что-то, что отвечает на ваш вопрос?Или вы ищете что-то ближе к _python_? Просто интересно, потому что, если вам нужно что-то более конкретное, я могу видеть, что я могу сделать. На боковой ноте кажется, что вы хорошо понимаете _python_. Почему вы переходите к _C# _? – tkellehe

Смежные вопросы