• .NET C#实现string类型List<T>二分查找算法功能(支持Contains模糊匹配)


    工作中用到了二分查找功能,二分查找在数据量稍微大一些的情况下,优势比较明显,数据量如果很小,和顺序查找没啥太大区别。

    二分查找算法具有前置条件的,集合必须是升序有序的。否则查找出来的结果是不正确的。自己以List<T>为基础封装一个自带升序排序功能的SortedList<T>,然后使用SortedList<T>再调用二分查找方法即可。

    0.准备

    using System.Collections.Generic;

     /// <summary>
        /// 自带排序功能的List<T>,方便二分查找时使用
        /// </summary>
        public class SortedList<T> : List<T>
        {
            /// <summary>
            /// 自带排序功能的添加方法
            /// </summary>
            /// <param name="item">数据项</param>
            public new void Add(T item)
            {
                int position = this.BinarySearch(item);//调用.NETFramework自己的BinarySearch实现
                if (position < 0)
                {
                    position = ~position;
                }

                this.Insert(position, item);
            }

            /// <summary>
            /// 自带排序功能的修改方法
            /// </summary>
            /// <param name="item">新数据项</param>
            /// <param name="index">被修改数据项的位置下标</param>
            public void ModifySorted(T item, int index)
            {
                this.RemoveAt(index);

                int position = this.BinarySearch(item);//调用.NETFramework自己的BinarySearch实现
                if (position < 0)
                {
                    position = ~position;
                }

                this.Insert(position, item);
            }
        }

    1.直接上工具类。

    public static class BinarySearchExtension
        {
            public static int BinarySearch(List<string> myArray, string key, bool isIncludeContains = false)
            {
                int lower = 0;
                int upper = myArray.Count - 1;
                int middleIndex;
                while (lower <= upper)
                {
                    middleIndex = (lower + upper) / 2;
                    if (myArray[middleIndex].Equals(key))
                    {
                        return middleIndex;
                    }

                    if (isIncludeContains)
                    {
                        if (myArray[middleIndex].Contains(key))
                        {
                            return middleIndex;
                        }
                    }

                    if (new CaseInsensitiveComparer().Compare(myArray[middleIndex], key) > 0)
                    {
                        upper = middleIndex - 1;
                    }
                    else
                    {
                        lower = middleIndex + 1;
                    }
                }

                if (key == myArray[lower])
                {
                    return lower;
                }
                if (isIncludeContains)
                {
                    if (myArray[lower].Contains(key))
                    {
                        return lower;
                    }
                }

                return -1;
            }
        }

    2.调用方式

    var sortedList = new SortedList<string>(){“aaa","dddd","a","321","0","xxxx"};

    var targetIndex = BinarySearchExtension.BinarySearch(sortedList,"MatchedString",true);

    if (targetIndex >= 0)

    {

    //找到了

    }

    else

    {

    //没有找到

    }

  • 相关阅读:
    TypeScript的泛型接口 泛型类接口
    typeScript中的泛型
    Node.js Tools 1.2 for Visual Studio 2015 released
    无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站
    jexus jws 安装
    coreos安装
    Visual Studio Code 怎么支持中文
    docker管理shipyard中文版v3.0.2更新
    docker和shipyard使用问题
    DESCryptoServiceProvider
  • 原文地址:https://www.cnblogs.com/jeff151013/p/16080902.html
Copyright © 2020-2023  润新知