none
排算问题 RRS feed

  • 问题

  • 有一个二维数组

    (1.)string[,] arr={{A1,A2,A3}{B1,B2,B3,B4}}

    也有可以是这样

    (2.)string[,] arr={{A1,A2,A3,null,null}{B1,B2,B3,B4,B5}{C1,null,null,null,null}}

    是不定项的

    现在我要对这个数组排序为:A1,B1,A2,B2,A3,B3,A1

    要怎么写??

    我写的:

      for (int k = 0; k < mediaInfo.GetLength(1); k++)
                            {
                                for (int j = 0; j < mediaInfo.GetLength(0); j++)
                                {
                                    if (tote > indexRow)
                                    {

                                        if (!string.IsNullOrEmpty(mediaInfo[j, k]))
                                        {
                                            deliveryinfoTmp.Update(new Md_KK_DeliveryinfoTmp()
                                            {
                                                ProjectCode = projectInfo[j, k],
                                                MediaCode = mediaInfo[j, k],

                                                DeliVeryID = modelLlist[indexRow].DeliVeryID
                                            });

                                            indexRow++;
                                        }
                                        
                                    }

                                }
                            }

    结果:A1,B1,A2,B2,A3,B3,B4

    2013年8月22日 5:25

答案

  • hello Myxzjie,

    这个问题其实做法很多。你可以寻求一个算法来完成操作,在这里,我用.net的方式来完成排算。

    核心思想就是把二维数组的问题演变为一个一维数组的问题,然后利用微软提供的现成功能来完成排序。

    首先把二维数组转化成一维数组。GUID=i+j*arr.GetLength(0) 这句是重点,给二维数组中的每个元素计算权重,最后的排序以此为依据。

    string[,] arr = {

                                { "A1", "A2", "A3",null },

                                { "B1", "B2", "B3", "B4" } ,

                                {"C1","C2",null,"C4"},

                                {"D1","D2","D3","D4"}

                                };

                int index = 0;

                List<Number> result = new List<Number>();

                for (int i = 0; i < arr.GetLength(0); i++)

                {

                    for (int j = 0; j < arr.GetLength(1); j++)

                    {

                        result.Add(new Number() { GUID = i + j * arr.GetLength(0), Value = arr[i, j] });

                        index++;

                    }

                }

    Number的类型定义

      class Number:IComparable<Number>

        {

            public int GUID { get; set; }

            public string Value { get; set; }

            public int CompareTo(Number other)

            {

                if (this.GUID > other.GUID)

                {

                    return 1;

                }

                if (this.GUID < other.GUID)

                {

                    return -1;

                }

                return 0;

            }

    }

    其中实现了IComparable<Number>接口,用于List<Number>的排序。

    最终的排序输出。需要注意的是null的就不要去输出了。

    result.Sort();

                foreach (var res in result)

                {

                    if (res.Value!=null)

                    {

                        Console.WriteLine(res.Value);

                    }

                }

    Best Regards,


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年8月23日 3:30
  • 您好,
    new string[] {"A1", "A2", "A3"},
    new string[] {"B1", "B2", "B3", "B4"}

    出來的結果是
    A1, B1, A2, B2, A3, B3, A1, B4 嗎?

    以下的code請您參考看看,

    string[][] jaggedArray = {
    	new string[] {"A1", "A2", "A3"},
    	new string[] {"B1", "B2", "B3", "B4"} 
    };
    //是否需要針對array排序?
    for (int i = 0; i < jaggedArray.Length; i++)
    {
    	Array.Sort(jaggedArray[i]);
    }
    //取得jaggedArray最長的長度
    int maxArrayLen = (from el in jaggedArray
    				   select el.Length).Max()-1;
    List<string> result = new List<string>();
    
    for (int j = 0; j <= maxArrayLen; j++)
    {
    	for (int i = 0; i < jaggedArray.Length; i++)
    	{
    		var idx = j;
    		if (idx >= jaggedArray[i].Length)
    			idx = j%maxArrayLen;
    		result.Add(jaggedArray[i][idx]);
    
    	}
    }
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年8月26日 1:36

全部回复

  • hello Myxzjie,

    这个问题其实做法很多。你可以寻求一个算法来完成操作,在这里,我用.net的方式来完成排算。

    核心思想就是把二维数组的问题演变为一个一维数组的问题,然后利用微软提供的现成功能来完成排序。

    首先把二维数组转化成一维数组。GUID=i+j*arr.GetLength(0) 这句是重点,给二维数组中的每个元素计算权重,最后的排序以此为依据。

    string[,] arr = {

                                { "A1", "A2", "A3",null },

                                { "B1", "B2", "B3", "B4" } ,

                                {"C1","C2",null,"C4"},

                                {"D1","D2","D3","D4"}

                                };

                int index = 0;

                List<Number> result = new List<Number>();

                for (int i = 0; i < arr.GetLength(0); i++)

                {

                    for (int j = 0; j < arr.GetLength(1); j++)

                    {

                        result.Add(new Number() { GUID = i + j * arr.GetLength(0), Value = arr[i, j] });

                        index++;

                    }

                }

    Number的类型定义

      class Number:IComparable<Number>

        {

            public int GUID { get; set; }

            public string Value { get; set; }

            public int CompareTo(Number other)

            {

                if (this.GUID > other.GUID)

                {

                    return 1;

                }

                if (this.GUID < other.GUID)

                {

                    return -1;

                }

                return 0;

            }

    }

    其中实现了IComparable<Number>接口,用于List<Number>的排序。

    最终的排序输出。需要注意的是null的就不要去输出了。

    result.Sort();

                foreach (var res in result)

                {

                    if (res.Value!=null)

                    {

                        Console.WriteLine(res.Value);

                    }

                }

    Best Regards,


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年8月23日 3:30
  • string[,] arr={{"A1","A2","A3",null,null},
                              {"B1","B2","B3","B4","B5"},
                              {"C1",null,null,null,null}};           
                List<string> list = new List<string>();
                foreach (string item in arr)
                {
                    if (item!=null)
                    {
                        list.Add(item);
                    }                
                }
                list.Sort((str1, str2) =>
                {
                    if (str1[1] > str2[1]) return 1;
                    else if (str1[1] == str2[1]) 
                        return 0;
                    else return -1;
                });
                list.ForEach((item) => { Console.Write(item + ","); });
                Console.Read();
    2013年8月25日 15:09
  • 您好,
    new string[] {"A1", "A2", "A3"},
    new string[] {"B1", "B2", "B3", "B4"}

    出來的結果是
    A1, B1, A2, B2, A3, B3, A1, B4 嗎?

    以下的code請您參考看看,

    string[][] jaggedArray = {
    	new string[] {"A1", "A2", "A3"},
    	new string[] {"B1", "B2", "B3", "B4"} 
    };
    //是否需要針對array排序?
    for (int i = 0; i < jaggedArray.Length; i++)
    {
    	Array.Sort(jaggedArray[i]);
    }
    //取得jaggedArray最長的長度
    int maxArrayLen = (from el in jaggedArray
    				   select el.Length).Max()-1;
    List<string> result = new List<string>();
    
    for (int j = 0; j <= maxArrayLen; j++)
    {
    	for (int i = 0; i < jaggedArray.Length; i++)
    	{
    		var idx = j;
    		if (idx >= jaggedArray[i].Length)
    			idx = j%maxArrayLen;
    		result.Add(jaggedArray[i][idx]);
    
    	}
    }
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年8月26日 1:36