注册 登录
编程论坛 C# 论坛

如何封裝更简洁

ppppooiiuu 发布于 2017-06-25 02:00, 3439 次点击
int[] 数组 = { 7, 6, 3, 2, 1, 4, 5, 8, 0, 9 };
for (int i = 0; i < 数组.GetLength(0) - 1; i++)
{
    for (int j = i + 1; j < 数组.GetLength(0); j++)
    {
        if (数组[i] > 数组[j])//>改为<则降序
        {
            int 临时 = 数组[i];
            数组[i] = 数组[j];
            数组[j] = 临时;
        }
    }
}
我把以上封装为一个升序排序的方法以便调用,但是如果我要封装为一个降序排序的方法又得把代码复制一次,把>改为<重新封装为另一个方法,可是就为了一个大于号改为小于号我就有两个几乎相同的代码,能不能有什么办法让他更简洁呢
5 回复
#2
yhlvht2017-06-26 22:23
想了两种方式
1、在实际算法时判断升序和降序
for()
{
   for()
   {
      if(升序)
      {
         if (数组[i] > 数组[j])
         {
         }
      }
      else
      {
         if (数组[i] < 数组[j])
         {
         }
      }
   }
}

2、先按升序排,若是降序再构造一个数组,将升序排好的数组反向输出
for (int i = 0; i < 数组.GetLength(0) - 1; i++)
{
    for (int j = i + 1; j < 数组.GetLength(0); j++)
    {
        if (数组[i] > 数组[j])//>改为<则降序
        {
            int 临时 = 数组[i];
            数组[i] = 数组[j];
            数组[j] = 临时;
        }
    }
}
if(降序)
{
    //创建一个新数组,将排好升序的数组从后往前赋值到新数组
}
#3
ppppooiiuu2017-06-27 00:08
回复 2楼 yhlvht
这样感觉也是写了两次,只是改变了表达方式
#4
yinniannian2017-06-27 16:40
LINQ 多简单。
#5
leisiege2017-06-30 21:17
把比较的方法单独出来。用的是C#的委托。白话文就是方法的变量。。。。。
linq就是这么写出来的。OrderBy ,OrderByDesc两个方法。数组可以直接用。比较器是默认的。
具体写法是:
程序代码:
  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Math(Bigger));
            Console.WriteLine(Math(Lesser));
            Console.ReadKey();
        }
        static string Math(compare method)
        {
            if (method())
            {
                return "Bigger";
            }
            else
            {
                return "Lesser";
            }
        }
        static bool Bigger ()
        {
            return true;
        }
        static bool Lesser ()
        {
            return false;
        }

    }
    delegate bool compare();



注意。delegate的层级和class是一样的。可以看成是一个变量的类型。跟int差不多。可以这样理解。但是要自己去看他的具体实现原理。挺复杂的。
#6
zzcl5582020-02-02 09:00
小白进来学习学习
1