开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5422|回复: 4
收起左侧

[C#作业] 第十八天作业

[复制链接]
发表于 2019-4-24 15:54:44 | 显示全部楼层 |阅读模式   广东省揭阳市
本帖最后由 老郭 于 2019-4-24 15:56 编辑

今日主要学习内容:
18.1 ISet接口介绍 HashSet SortedSet与 List 的差异 插入效率对比 HashSet 源码阅读

18.2 集合的交集 并集 差集 补集运算

18.3 从原理了解IEnumerable 与 IEnumerator接口的实现

今日作业

获取下列2个集合的 交集 并集 差集?
List<int> intList = new List<int> {11,12,13,14,15}
List<int> intList2 = new List<int> {14,15,16,17,18}


HashSet 的插入效率真的比 List高吗(为什么)?
如果一个集合要实现 foreach 循环必须实现___接口(请动手实现)?


发表于 2019-6-24 14:20:43 | 显示全部楼层   湖南省长沙市

今日作业
1.获取下列2个集合的 交集 并集 差集?
List intList = new List {11,12,13,14,15}
List intList2 = new List {14,15,16,17,18}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 第十八天Iset集 {
    class Program {
        static void Main (string[] args) {
            HashSet<int> str = new HashSet<int> ();
            str.Add (11);
            str.Add (12);
            str.Add (13);
            str.Add (14);
            str.Add (15);
            HashSet<int> str1 = new HashSet<int> ();
            str1.Add (14);
            str1.Add (15);
            str1.Add (16);
            str1.Add (17);
            str1.Add (18);

            str.UnionWith (str1); //并集
            System.Console.WriteLine (string.Join (",", str.ToArray ()));
            str.Clear ();
            str.Add (11);
            str.Add (12);
            str.Add (13);
            str.Add (14);
            str.Add (15);
            str.IntersectWith (str1); //交集
            System.Console.WriteLine (string.Join (",", str.ToArray ()));

            str.Clear ();
            str.Add (11);
            str.Add (12);
            str.Add (13);
            str.Add (14);
            str.Add (15);
            str.ExceptWith (str1); //差集 求补
            str1.ExceptWith (str);
            System.Console.WriteLine (string.Join (",", str.ToArray ()));
            System.Console.WriteLine (string.Join (",", str1.ToArray ()));

            str.Clear ();
            str.Add (11);
            str.Add (12);
            str.Add (13);
            str.Add (14);
            str.Add (15);
            str.SymmetricExceptWith (str1); //对称差集
            System.Console.WriteLine (string.Join (",", str.ToArray ()));
        }
    }
}

2.HashSet 的插入效率真的比 List高吗(为什么)?

  • HashSet 的插入效率真的比 List高吗(为什么)?
  • 快速不重复的插入数据使用HashSet,快速不重复有序排序使用Sorteset,
  • 不需要判断的情况下,List速度更快,List的Add 只是往数组尾部添加数据
  • 需要判断的情况下,HashSet速度更快,HashSet需要遍历节点,查看节点中有没有重复的

3.如果一个集合要实现 foreach 循环必须实现___接口

  • IEnumerable
IEnumerable<Person> {
    public Person[] persons;
    public Persons () {
        persons = new Person[10];
        for (int i = 0; i < 10; i++) {
            persons = new Person { Name = "张三" + i };
        }
    }
    public IEnumerator<Person> GetEnumerator () {
        return new PersonEnumerator (persons);
    }
    IEnumerator IEnumerable.GetEnumerator () {
        return GetEnumerator ();
    }
}
class PersonEnumerator : IEnumerator<Person> {
    private Person[] persons;
    private int pos;
    public Person Current {
        get {
            return persons[pos];
        }
    }
    object IEnumerator.Current => persons[pos];
    public PersonEnumerator (Person[] persons) {
        this.persons = persons;
        pos = -1;
    }
    public void Dispose () { }
    public bool MoveNext () {
        pos++;
        return pos < persons.Length;
    }
    public void Reset () {
        pos = -1;
    }
}

评分

参与人数 1好评 +1 精币 +10 收起 理由
老郭 + 1 + 10 很赞同,谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2019-6-3 15:28:10 | 显示全部楼层   江苏省南京市
本帖最后由 曜石头 于 2019-6-3 15:32 编辑

1、获取下列2个集合的 交集 并集 差集?
List<int> intList = new List<int> {11,12,13,14,15}
List<int> intList2 = new List<int> {14,15,16,17,18}
        HashSet<int> str = new HashSet<int>{ 11, 12, 13, 14, 15 };
        HashSet<int> str1 = new HashSet<int>{ 14, 15, 16, 17, 18 };
        HashSet<int> str2 = str;
        str2.IntersectWith(str1);//交集
        HashSet<int> str3 = str;        
        str3.UnionWith(str1);//并集
        HashSet<int> str4 = str;        
        str4.SymmetricExceptWith(str1);//差集
        

2、HashSet 的插入效率真的比 List高吗(为什么)?
在成员数量较大和考虑成员去重时HashSet要比List的高,
去重需要cha询已经添加过的成员,HashSet主要快在通过hashcode加链表方式快速cha询上

3、如果一个集合要实现 foreach 循环必须实现___接口(请动手实现)?
IEnumerable和IEnumerator          本质都是调用IEnumerator 中的MoveNext()并返回Current
class 类:IEnumerable<Person> {
        public Person[] persons;
        public Persons() {
            persons = new Person[10];
            for (int i = 0; i < 10; i++){
                persons =  new Person { Name = "张三" + i };
            }
        }
        public IEnumerator<Person> GetEnumerator(){
            return new PersonEnumerator(persons);
            //foreach (Person item in persons){//让数组帮我们实现
            //    yield return item;//yield延迟执行
            //}
        }
        IEnumerator IEnumerable.GetEnumerator(){
            return GetEnumerator();
        }
}
class PersonEnumerator : IEnumerator<Person>{
        private Person[] persons;
        private int pos;
        public Person Current {
            get {//item接收内容
                return persons[pos];
            }
        }
        object IEnumerator.Current => persons[pos];//那么他 表达式 这里指返回persons[pos]
        public PersonEnumerator(Person[] persons) {
            this.persons = persons;
            pos = -1;
        }
        public void Dispose(){ }//垃圾回收会调用  
        public bool MoveNext(){//每次把指针指向下一个成员 判断是否到最后
            pos++;
            return pos < persons.Length;
        }
        public void Reset(){
            pos =-1;
        }
}

ps:老师都是从哪学的这些高深的学问。。。。。。。佩服佩服

评分

参与人数 1好评 +1 精币 +10 收起 理由
老郭 + 1 + 10 很赞同,谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:32% (6/19)

签到天数: 4 天

发表于 2019-5-22 08:38:22 | 显示全部楼层   贵州省黔东南苗族侗族自治州
看看再说了
回复 支持 反对

使用道具 举报

发表于 2019-4-25 18:08:40 | 显示全部楼层   江苏省扬州市
似懂非懂的感觉。。。。
1、获取下列2个集合的 交集 并集 差集?
List<int> intList = new List<int> {11,12,13,14,15}
List<int> intList2 = new List<int> {14,15,16,17,18}

            List<int> intList = new List<int> { 11, 12, 13, 14, 15 };
            List<int> intList2 = new List<int> { 14, 15, 16, 17, 18 };

            List<int> intList3 = intList.Union(intList2).ToList();                //11, 12, 13, 14, 15, 16, 17, 18
            List<int> intList4 = intList.Intersect(intList2).ToList();        //14, 15
            List<int> intList5 = intList.Except(intList2).ToList();                //11, 12, 13

            Console.WriteLine(string.Join(",", intList5.ToArray()));
            Console.Read();

2、HashSet 的插入效率真的比 List高吗(为什么)?
List申请内存是连续长度明确的,而HashSet元素是无序的、不重复的、位置固定的;
List插入和删除会引起元素位置的改变,Set不会。

3、如果一个集合要实现 foreach 循环必须实现___接口(请动手实现)?
IEnumerable接口GetEnumerator方法

       static void Main(string[] args)
        {

            MyList<int> list = new MyList<int>()
            {
                Items = new int[] { 11, 12, 13, 14, 15 }
            };
           
            foreach (int item in list)
            {
               Console.WriteLine(item.ToString());
            }
            Console.Read();
        }
        

        public class MyList<T> : IEnumerable
        {
            public int Count => Items == null ? 0 : Items.Length;
            
            public T[] Items { get; set; }

            public T this[int pos]
            {
                get { return Items[pos]; }
            }
            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
           // public IEnumerator<T> GetEnumerator()
           // {
           //     foreach (T item in Items)
           //     {
           //         yield return item;
           //     }
           //此方法就不需要再写class MyEnumerator<T> : IEnumerator
           //或者
            public IEnumerator GetEnumerator()
            {
                return new MyEnumerator<T>() { List = this };
            }
        }

        public class MyEnumerator<T> : IEnumerator
        {
            private int pos = -1;
            public MyList<T> List { get; set; }

            public void Reset()
            {
                pos = -1;
            }

            public bool MoveNext()
            {
                pos++;
                return (pos < List.Count);
            }

            
            object IEnumerator.Current => List[pos];
        }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表