C# İki Boyutlu Diziyi Tek Boyutlu Diziye Çevirmek

C# İki Boyutlu Diziyi Tek Boyutlu Diziye Çevirmek

C# Dizi Boyutları Arası Dönüştürme İşlemleri

Hepinize merhaba arkadaşlar bu yazımda sizlere bir ve iki boyutlu diziler arasında nasıl bir çeviri işlemi yapabileceğinizi anlatacağım. Neden böyle bir şeye ihtiyaç duyalım diyenlerinizin olduğunu duyar gibiyim kısaca özetlemem gerekir ise iki gündür bir XOX oyunu üzerinde çalışıyordum ve online alt yapısı olarak Firebase kullandım.  

Firebase'ın içerisinde ise Firestore kullanmayı düşünmüştüm ki Firestore ne yazık ki çok boyutları desteklemiyormuş ve tek boyutlu dizi olarak kaydediyordu verileri ancak benim veri yapım çok boyutlu (2D) yapıdaydı ve böyle bir convert / dönüşüm işlemine gerek duydum. 

Neyse lafı fazla uzatım daha fazla vaktinizi çalmadan gelin bu işlemi nasıl yapıyoruz inceleyelim.

Not: Aşağıdaki kodları kendiniz düzenleyip daha büyük boyutlu diziler için uyarlayabilirsiniz.

İki Boyutlu Diziyi Tek Boyutlu Diziye Çevirmek

        public static T[] ConvertToArray(T[,] matrix)
        {
            var array = matrix.Cast().ToArray(); // LINQ yardımı ile matrisimizi array a çeviriyoruz.
            return array; // Çıkan sonucu döndürüyoruz.
        }

Tek Boyutlu Diziyi İki Boyutlu Diziye Çevirmek

               public static T[,] ConvertToMatrix(T[] array, int lenght)
        {
            if (array.Length != lenght * lenght) // Dizinin genişliğini kontrol ediyoruz, matrix ile uyumlu olacak mı?
                Console.WriteLine("Invalid Lenght"); // Uyumlu değilse hata çıktısı verdiriyoruz.

            var matrix = new T[lenght, lenght]; // Matrisimizi oluşturuyoruz.
            var counter = 0; // Dizinin içinde gezebilmek için bir counter/sayaç oluşturduk.

            // Diziyi matris e çevirme işlemini yaptığımız dönğümüz.
            for(var y = 0; y < lenght; y++)
            {
                for(var x = 0; x < lenght; x++)
                {
                    matrix[y, x] = array[counter];
                    counter++;
                }
            }

            return matrix; // Çıkan sonucu döndürüyoruz.
        }

Tüm Kodlar

using System;
using System.Linq;

namespace TestProject
{
    class MainClass
    {
        public static void Main(string[] args)
        {

            Console.WriteLine("----- Array To Matrix Start -----");

            // Deneme yapmak için bir dizi oluşturuyoruz.
            int[] numberArray = new int[9]
            {
                0,1,2,3,4,5,6,7,8
            };

            // Dizimizi matris e dönüştürüyoruz.
            var numberConvertedMatrix = ConvertToMatrix(numberArray, 3);

            // Çıkan sonucu ekrana yazdırıyoruz.
            for(int y = 0; y < 3; y++)
            {
                for (int x = 0; x < 3; x++)
                {
                    Console.Write($"{numberConvertedMatrix[y, x]}");
                }
                Console.Write("\n");

            }

            // Burada numberConvertedMatrix in yani matris değişkenimizin tipini ekrana yazdırıyoruz bize int[,] çıktısınız veriyor.
            Console.WriteLine($"{numberConvertedMatrix}");

            Console.WriteLine("----- Array To Matrix Finish -----");
            Console.WriteLine("----- Matrix To Array Start -----");

            // Matris oluşturuyoruz.
            int[,] numberMatrix = new int[3, 3]
            {
                {0,1,2 },
                {3,4,5 },
                {6,7,8 }
            };

            // Matrisimizi diziye dönüştürüyoruz. Burada ConvertToArray yazan yerdeki  kısmını istediğiniz değişken tipini yazarak istediğiniz değişken tipinde bu fonksiyonu kullanabilirsiniz.
            var numberConvertedArray = ConvertToArray(numberMatrix);


            // Çıkan sonucu ekrana yazdırıyoruz
            foreach(var number in numberConvertedArray)
            {
                Console.WriteLine($"{number}");
            }

            // Burada numberConvertedArray ı yani dizi değişkenimizin tipini ekrana yazdırıyoruz bize int[] çıktısınız veriyor.

            Console.WriteLine($"{numberConvertedArray}");
            Console.WriteLine("----- Matrix To Array Finish -----");


        }


        public static T[,] ConvertToMatrix(T[] array, int lenght)
        {
            if (array.Length != lenght * lenght) // Dizinin genişliğini kontrol ediyoruz, matrix ile uyumlu olacak mı?
                Console.WriteLine("Invalid Lenght"); // Uyumlu değilse hata çıktısı verdiriyoruz.

            var matrix = new T[lenght, lenght]; // Matrisimizi oluşturuyoruz.
            var counter = 0; // Dizinin içinde gezebilmek için bir counter/sayaç oluşturduk.

            // Diziyi matris e çevirme işlemini yaptığımız dönğümüz.
            for(var y = 0; y < lenght; y++)
            {
                for(var x = 0; x < lenght; x++)
                {
                    matrix[y, x] = array[counter];
                    counter++;
                }
            }

            return matrix; // Çıkan sonucu döndürüyoruz.
        }

        public static T[] ConvertToArray(T[,] matrix)
        {
            var array = matrix.Cast().ToArray(); // LINQ yardımı ile matrisimizi array a çeviriyoruz.
            return array; // Çıkan sonucu döndürüyoruz.
        }
    }
}