c#簡單實現二維陣列和二維陣列列表List<>的轉置

iDotNetSpace發表於2009-11-16

剛看到網上一篇博文裡用sql實現了行列轉置。sql server 2005/2008只用一個pivot函式就可以實現sql server 2000很多行的複雜實現。提到轉置,立刻想起還在求學階段曾經做過的一個練習,用c語言實現二維陣列的轉置。相信大家都做過這個練習。下面利用c#利器也實現一遍,沒有實際意義,練練手而已。

1、二維陣列轉置

c#簡單實現二維陣列和二維陣列列表List<>的轉置
 class Program
    {
        
public static string[,] Rotate(string[,] array)
        {
            
int x = array.GetUpperBound(0); //一維 
            int y = array.GetUpperBound(1); //二維 
            string[,] newArray = new string[y + 1, x + 1]; //構造轉置二維陣列
            for (int i = 0; i <= x; i++)
            {
                
for (int j = 0; j <= y; j++)
                { 
                    newArray[j, i] 
= array[i, j]; 
                }
            } 
            
return newArray;
        }

        
static void Main(string[] args)
        {

            
string[,] array = new string[42];
            
for (int i = 0; i < 4; i++)
            {
                
for (int j = 0; j < 2; j++)
                {
                    array[i, j] 
= i.ToString() + j.ToString();
                }
            }

            
//顯示原陣列
            Console.WriteLine("Source Array:");
            
for (int i = 0; i < 4; i++)
            {
                
string soureResult = string.Empty;
                
for (int j = 0; j < 2; j++)
                {
                    soureResult 
+= array[i, j] + "  ";
                }
                Console.WriteLine(soureResult);
            }

            
string[,] newArray = Rotate(array);
            
//顯示轉置後的陣列
            Console.WriteLine("Destiney Array:");
            
for (int i = 0; i < 2; i++)
            {
                
string dstResult = string.Empty;
                
for (int j = 0; j < 4; j++)
                {
                    dstResult 
+= newArray[i, j] + "  ";
                }
                Console.WriteLine(dstResult);
            }

            Console.ReadLine();
        }
    }

 2、二維陣列列表List<>的轉置
這個是想到在實際專案中操作集合經常用到泛型List,順便實現一下它的轉置。思路很簡單,根據1,我們已經實現了轉置,所以就要想方設法把泛型List轉換成二維陣列,然後轉置,接著將轉換後的陣列再轉換成泛型List。呵呵,筆者偷懶慣了,其實應該還有其他的方法,不管了,先實現看下效果。

c#簡單實現二維陣列和二維陣列列表List<>的轉置
 class Program
    {
        
/// 
        
/// 二維陣列轉置函式
        
/// 
        
/// 
        
/// 
        public static string[,] Rotate(string[,] array)
        {
            
int x = array.GetUpperBound(0); //一維 
            int y = array.GetUpperBound(1); //二維 
            string[,] newArray = new string[y + 1, x + 1]; //構造轉置二維陣列
            for (int i = 0; i <= x; i++)
            {
                
for (int j = 0; j <= y; j++)
                { 
                    newArray[j, i] 
= array[i, j]; 
                }
            } 
            
return newArray;
        }

        
/// 
        
/// 將二維列表(List)轉換成二維陣列,二維陣列轉置,然後將二維陣列轉換成列表
        
/// 
        
/// 
        
/// 
        public static List<List<string>> Rotate(List<List<string>> original)
        {
            List
<string>[] array = original.ToArray();
            List
<List<string>> lists = new List<List<string>>();
            
if (array.Length==0)
            {
                
throw new IndexOutOfRangeException("Index OutOf Range");
            }
            
int x = array[0].Count;
            
int y = original.Count;

            
//將列表抓換成陣列
            string[,] twoArray = new string[y, x];
            
for (int i = 0; i < y; i++)
            {
                
int j = 0;
                
foreach (string s in array[i])
                {
                    twoArray[i, j] 
= s; 
                    j
++;
                }
            }

            
string[,] newTwoArray = new string[x, y];
            newTwoArray 
= Rotate(twoArray);//轉置

            
//二維陣列轉換成二維List集合
            for (int i = 0; i < x; i++)
            {
                List
<string> list = new List<string>();
                
for (int j = 0; j < y; j++)
                {
                    list.Add(newTwoArray[i, j]);
                }
                lists.Add(list);
            }
            
return lists;
        }

        
static void Main(string[] args)
        {
            List
<List<string>> sourceList = new List<List<string>>(); //測試的二維List
            for (int i = 0; i < 4; i++)
            {
                List
<string> list = new List<string>();
                
for (int j = 0; j < 2; j++)
                {
                    list.Add(i.ToString() 
+ j.ToString());
                }
                sourceList.Add(list);
            }

            
//顯示原列表
            Console.WriteLine("Source List:");
            
for (int i = 0; i < sourceList.Count; i++)
            {
                
string soureResult = string.Empty;
                
for (int j = 0; j < sourceList[i].Count; j++)
                {
                    soureResult 
+= sourceList[i][j] + "  ";
                }
                Console.WriteLine(soureResult);
            }

            List
<List<string>> dstList = Rotate(sourceList);
            
//顯示轉置後的列表
            Console.WriteLine("Destiney List:");
            
for (int i = 0; i < dstList.Count; i++)
            {
                
string dstResult = string.Empty;
                
for (int j = 0; j < dstList[i].Count; j++)
                {
                    dstResult 
+= dstList[i][j] + "  ";
                }
                Console.WriteLine(dstResult);
            }

            Console.ReadLine();
        }
    }

來自:http://www.cnblogs.com/wjfluisfigo/archive/2009/11/15/1603130.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-619741/,如需轉載,請註明出處,否則將追究法律責任。

相關文章