用C#委托实现在不同排序规则下对数组的排序

了解委托的人都知道C#中的委托相当于C++中的函数指针,但相当于C++中的函数指针来讲,它是面向对象的,是类型安全的,具有众多的优点。C#中的委托多用于构造事件。

本 文是C#委托的一个简单示例,主要是说明C#中委托的使用方法,并依此实现在一个排序函数中按指定的排序规则对数组进行排序。

以下是详细的源码。

        // 声明一个委托
         private   delegate   bool  SortDelegate( double  num1, double  num2);

        
// 委托SortDelegate的实例Sd作为排序Sort函数是一个形参是为了给排序指定排序规则,如:从小到大,从大到小
        
// 或按每个数字的各位数之和从小到大或从大到小进行排序(对于浮点数,位数只计算小数点之前的)
        
// 在调用时Sd需传入一个函数的函数名
         private   string  Sort( string  Org,SortDelegate Sd)
        
{
            
string[] Old = Org.Split(',');
            
int Len = Old.Length;
            
for(int i=0;i<Len;i++)
                
if(!IsNumeric(Old[i]))
                
{
                    MessageBox.Show(
"对不起,您输入的不是数字,不能排序。");
                    
return " ";
                }

            
double[] Num = new double[Len];
            
for (int i = 0; i < Len; i++)
            
{

                Num[i] 
= double.Parse(Old[i]);
            }

            
//调用冒泡排序法
            BubbleSort(ref Num,Sd);

            
string Res="";
            
for (int i = 0; i < Len; i++)
            
{
                Res 
+= Num[i].ToString();
                
if (i != Len-1)
                    Res 
+= " ";
            }

            
return Res;
        }

        
static   bool  IsNumeric( string  str)
        
{
            
if (str == null || str.Length == 0)
                
return false;
            
foreach (char c in str)
            
{
                
if (!Char.IsNumber(c))
                
{
                    
return false;
                }

            }

            
return true;
        }
 

        
// 冒泡法排序
         private   void  BubbleSort( ref   double [] num, SortDelegate Sd)
        
{
            
int Len = num.Length;
            
for (int i = 1; i < Len; i++)
                
for (int j = 0; j < Len-i; j++)
                
{
                    
if (!Sd(num[j], num[j+1]))
                    
{
                        
double temp = num[j];
                        num[j] 
= num[j+1];
                        num[j
+1= temp;
                    }

                }

        }

        
// 按各位数和从小到大排序函数,浮点数小数点后的数字忽略
         private   bool  BitSmallSort( double  Num1,  double  Num2)
        
{
            
int n1 = (int)Num1, n2 = (int)Num2;
            
int s1 = 0, s2 = 0;
            
while (n1!=0)
            
{
                s1 
+= n1 % 10;
                n1 
/= 10;
            }

            
while (n2!=0)
            
{
                s2 
+= n2 % 10;
                n2 
/= 10;
            }

            
return s1<s2;
        }

        
// 按各位数和从小到大排序函数
         private   bool  BitBigSort( double  Num1,  double  Num2)
        
{
            
return !BitSmallSort(Num1, Num2);
        }

        
// 两个双精度数的小于关系
         private   bool  Small( double  n1,  double  n2)
        
{
            
return n1 < n2;
        }

        
// 两个双精度数的大于关系
         private   bool  Big( double  n1,  double  n2)
        
{
            
return n1 > n2;
        }


        
private   void  BtnSort_Click( object  sender, EventArgs e)
        
{
            
if (RbBitSmall.Checked)
                TxtRes.Text 
= Sort(TxtOrig.Text, BitSmallSort);
            
else if (RbBitBig.Checked)
                TxtRes.Text 
= Sort(TxtOrig.Text, BitBigSort);
            
else if (Rbxiao.Checked)
                TxtRes.Text 
= Sort(TxtOrig.Text, Small);
            
else if (RbDa.Checked)
                TxtRes.Text 
= Sort(TxtOrig.Text, Big);
        }

 

本文的源程序:

http://download1.csdn.net/down3/20070617/17135051171.rar

本文是作者原创,转载请注明出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值