自己实现的一个数组排序并去重的功能

【前沿】公司开发使用的是.Net Framework2.0的,所以不能用Linq,所以自己写了个排序并去重的方法!其实实现数组排序并去重的功能并不是很难,一般只要会编程的都会实现,但是大部分人可能会写多个循环(1.排序;2.去重),而我直接在排序的时候就去检查元素的重复,提高了效率。。。当然如果还有更更好的实现思路,请拍砖指出。。。。

代码部分

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
    /// <summary>
    /// Author:DreamSea
    /// Time:2011-7-17 23:35:53
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            string[] array = new string[] { "Z", "O", "A", "F", "C", "B", "E", "U", "D", "C", "B", "C", "D", "A", "A" };
            Console.WriteLine("原始数据:"+String.Join(",",array));
            Console.WriteLine("排序并去重后的结果(降序):" + String.Join(",", SortAndDdistinct(array, OrderByType.DESC)));
            Console.WriteLine("排序并去重后的结果(升序):" + String.Join(",", SortAndDdistinct(array, OrderByType.ASC)));
            Console.Read();
        }

        /// <summary>
        /// 去除数组中重复的记录并排序
        /// </summary>
        /// <param name="array">数组</param>
        /// <param name="orderByType">排序方式</param>
        /// <returns>处理后的数组</returns>
        public static string[] SortAndDdistinct(string[] array, OrderByType orderByType)
        {
            List<String> result = new List<string>();
            string[] newArray = array;
            bool isChange = false;      //本次循环是否排序过
            int j = 0;                  //排序循环叠加变量
            if (OrderByType.ASC == orderByType)  //升序
            {
                for (int i = 0; i < newArray.Length; i++)
                {
                    isChange = false;
                    for (; j < newArray.Length - 1 - i; j++)
                    {
                        if (newArray[j].CompareTo(newArray[j + 1]) > 0)  //每次将相对较小大的值放在后面
                        {
                            string swap = newArray[j];
                            newArray[j] = newArray[j + 1];
                            newArray[j + 1] = swap;
                            //排序过
                            isChange = true;
                        }
                    }

                    string value = newArray[newArray.Length - 1 - i];
                    if (!result.Contains(value))   //如果集合中未包含该元素,则添加
                        result.Add(value);

                    //判断是否继续排直接序操作
                    //如果上次操作未排,则下次不再排序,直接去重复
                    j = isChange ? 0 : newArray.Length;
                }
            }
            else   //降序
            {
                for (int i = 0; i < newArray.Length; i++)
                {
                    isChange = false;
                    for (; j < newArray.Length - 1 - i; j++)
                    {
                        if (newArray[j].CompareTo(newArray[j + 1]) < 0)  //每次将相对较的值放在后面
                        {
                            string swap = newArray[j];
                            newArray[j] = newArray[j + 1];
                            newArray[j + 1] = swap;
                            //排序过
                            isChange = true;
                        }
                    }

                    string value = newArray[newArray.Length - 1 - i];
                    if (!result.Contains(value))   //如果集合中未包含该元素,则添加
                        result.Add(value);

                    //判断是否继续排直接序操作
                    //如果上次操作未排,则下次不再排序,直接去重复
                    j = isChange ? 0 : newArray.Length;
                }
            }
            return result.ToArray();
        }
    }

    /// <summary>
    /// 排序方式
    /// </summary>
    public enum OrderByType
    {
        ASC, DESC
    }
}

效果预览

后记

第一次写博客,可能语言组织的不是很完美,请给位大鸟不吝指教.....

posted on 2011-07-17 23:44  DreamSea530  阅读(1691)  评论(1编辑  收藏  举报

导航