草庐IT

C#-初始泛型[仿写List集合类]

[春风十里] 2023-03-28 原文

泛型(Generic) 允许延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。

日常代码编写中泛型使用较多的类比如List,Dictionary,本次使用泛型重写List类,加深理解。

首先定义类ListT,并在类内部声明一个数组用来存储数据:

public class ListT<T> :IEnumerable
{
     private T[] rawData = new T[0];
}

List常用的属性或方法有1.Count ,2.Contains(),3.IndexOf(),4.First(),5.Last(),6.Where(),7.FindAll(),8.Remove(),

9.RemoveAt(),10.Add(),11.AddRange(),12.Clear();

1 返回集合数量,2 查询是否包含元素,3 元素在集合中的序号:

        /// 返回集合元素数量
        public int Count
        {
            get { return rawData.Length; }
        }
        /// 返回元素在队列中的序号,若无返回-1
        public int IndexOf(T temp)
        {
            int id = -1;
            for (int i = 0; i < Count; i++)
            {
                if (Equals(rawData[i], temp))
                    return i;
            }
            return id;
        }
        /// 表示元素是否在集合内
        public bool Contains(T temp)
        {
            foreach (var v in rawData)
            {
                if (Equals(v, temp))
                    return true;
            }
            return false;
        }

4 返回第一个元素,5 返回最后一个元素,6 返回满足条件的第一个元素,7 返回所有满足条件的元素的集合:

        /// 索引器
        public T this[int index]
        {
            get { return rawData[index]; }
            set { rawData[index] = value; }
        }
        /// 返回第一个元素
        public T First()
        {
            return rawData.First();
        }
        /// 返回最后一个元素
        public T Last()
        {
            return rawData.Last();
        }
        /// 查找符合条件的第一个元素,若无则返回类型的默认值。
        public T Where(Predicate<T> match)
        {
            foreach (T temp in rawData)
            {
                if (match(temp))
                    return temp;
            }
            return default(T);
        }
        /// 返回所有满足条件的元素集合
        public ListT<T> FindAll(Predicate<T> match)
        {
            ListT<T> temp = new ListT<T>();
            foreach (var v in rawData)
            {
                if (match(v))
                    temp.Add(v);
            }
            return temp;
        }

8 删除第一个相同的元素,9.删除指定序号的元素,10.添加一个元素,11.添加元素集合,12.清空集合:

        /// 枚举器
        public IEnumerator GetEnumerator()
        {
            foreach (T temp in rawData)
                yield return temp;
        }
        /// 移除第一个相等的元素
        public void Remove(T temp)
        {
            int index = IndexOf(temp);
            if (index != -1)
            {
                RemoveAt(index);
            }
        }
        /// 移除指定Index的元素
        public bool RemoveAt(int index)
        {
            if (index >= Count)
                return false;
            T[] tempArray = rawData;
            rawData = new T[Count - 1];
            for (int i = 0; i < tempArray.Length; i++)
            {
                if (i == index)
                    continue;
                if (i < index)
                    rawData[i] = tempArray[i];
                if (i > index)
                    rawData[i - 1] = tempArray[i];
            }
            return true;
        }
        /// 添加元素
        public void Add(T newData)
        {
            T[] tempData = rawData;
            //rawData = new T[count * 2];
            rawData = new T[Count + 1];
            for (int i = 0; i < Count - 1; i++)
            {
                rawData[i] = tempData[i];
            }
            rawData[Count - 1] = newData;
        }
        /// 将新队列添加到末尾
        public void AddRange(ListT<T> newList)
        {
            T[] tempData = rawData;
            rawData = new T[Count + newList.Count];
            for (int i = 0; i < Count - newList.Count; i++)
            {
                rawData[i] = tempData[i];
            }
            for (int i = Count - newList.Count; i < Count; i++)
            {
                rawData[i] = newList[i - Count + newList.Count];
            }
        }
        /// 清空集合
        public bool Clear()
        {
            rawData = new T[0];
            return true;
        }

以上功能代码已实现,验证下函数功能是否正常:

                ListT<int> intList = new ListT<int>();
                ListT<string> strList = new ListT<string>();
                ListT<float> floatList = new ListT<float>();
                for (int i = 0; i < 5; i++)
                {
                    strList.Add(i.ToString());
                    intList.Add(i);
                    floatList.Add(+i / 5.0f);
                }
                txtPanel.AppendText("Foreach \r\n");
                foreach (var v in strList)
                    txtPanel.AppendText(v.ToString() + "\t");
                txtPanel.AppendText("\r\n");
                foreach (var v in intList)
                    txtPanel.AppendText(v.ToString() + "\t");
                txtPanel.AppendText("\r\n");
                foreach (var v in floatList)
                    txtPanel.AppendText(v.ToString() + "\t");
                txtPanel.AppendText("For \r\n");
                for (int i = 0; i < strList.Count; i++)
                {
                    txtPanel.AppendText(strList[i] + "\t");
                    txtPanel.AppendText(intList[i].ToString() + "\t");
                    txtPanel.AppendText(floatList[i].ToString() + "\t");
                    txtPanel.AppendText("\r\n");
                }

 

有关C#-初始泛型[仿写List集合类]的更多相关文章

  1. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  2. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  3. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  9. ruby - 为什么当我调用类的实例方法时,初始化不显示为方法? - 2

    我正在写一篇关于在Ruby中几乎一切都是对象的博客文章,我试图通过以下示例来展示这一点:classCoolBeansattr_accessor:beansdefinitialize@bean=[]enddefcount_beans@beans.countendend所以从类中我们可以看出它有4个方法(当然,除非我错了):它可以在创建新实例时初始化一个默认的空bean数组它可以计算它有多少个bean它可以读取它有多少个bean(通过attr_accessor)它可以向空数组写入(或添加)更多bean(也通过attr_accessor)但是,当我询问类本身它有哪些实例方法时,我没有看到默认

  10. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

随机推荐