C#定义一个泛型集合类。要求:实现Ienumerable<T>接口,T是值类型,并T取2个类型分别测试。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#定义一个泛型集合类。要求:实现Ienumerable<T>接口,T是值类型,并T取2个类型分别测试。相关的知识,希望对你有一定的参考价值。

如题,求实现代码!

.IEnumerable<T>接口IEnumerable<T>泛型接口支持在制定数据集合上进行迭代操作。它定义了一组扩展方法,用来对数据集合中的元素进行遍历、过滤、排序、搜索等操作。在LINQ中,数据源实际上是实现了接口IEnumerable<T>的类,通过select子句返回的查询结果页是一个实现了IEnumerable<T>的类。在.NET类库中,IEnumerable<T>接口提供了大量与查询相关的方法。这些方法实际上是以扩展方法的形式定义,但是由于它的作用类型也为IEnumerable<T>接口,所以使用上和成员方法很类似。IEnumerable<T>接口主要成员成员
功能

Aggregate 对序列应用累加器函数,可以指定累加方法
Sum 计算序列中所有元素的和,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法

Average 计算序列中所有元素的平均值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法

Max 计算序列中所有元素的最大值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法
Min 计算序列中所有元素的最小值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法
All 检查是否序列中所有元素都满足条件,可以指定条件判断方法。如果所有元素都满足条件返回True,否则返回False
Any 检查序列中是否有任何一个元素满足条件,可以指定条件的判断方法。如果有一个以上(含一个)元素满足条件返回True,否则返回False
Contains 检查数据系列中是否包含特定的元素,可以指定相等比较方法
Count 返回序列中满足指定条件的元素的数量,可以指定条件判断方法
LongCount 返回序列中满足指定条件的元素的长数量,可以指定条件判断方法
Cast 将IEnumerable中的元素转换为指定的数据类型
DefaultIfEmpty 返回序列中指定位置的元素。如果序列为空,则返回默认的元素值
ElementAt 返回序列中指定索引处的元素
ElementAtOrDefault 返回序列中指定索引处的元素。如果序列为空,则返回默认值
First 返回序列中满足指定条件的第一个元素,可以指定条件判断方法
FirstOrDefault 返回序列中满足指定条件的第一个元素。如果不存在则返回默认值,也可以指定条件判断方法
Last 返回序列中满足指定条件的最后一个元素,可以指定条件判断方法
LastOrDefault 返回序列中满足指定条件的最后一个元素。如果不存在则返回默认值,也可以指定条件判断方法
Single 返回序列中满足指定条件的唯一元素。如果不止一个元素满足条件会引发一场,可以指定条件判断方法
SingleOrDefault 返回序列中满足指定条件的唯一元素。如果不存在则返回默认值,如果不止一个元素满足条件会引发一场,可以指定条件判断方法
Reverse 反转序列中元素的顺序
Distinct 返回序列中不重复的元素的集合,可以指定相等比较方法
Concat 连接两个序列,直接首尾相连。返回结果可能存在重复数据
Except 获取两个元素集合的差集,可以指定相等比较方法
Intersect 获取两个元素集合的交集,可以指定相等比较方法
Union 获取两个元素集合的并集,可以指定相等比较方法
SequenceEqual
比较两个序列是否相等,可以指定相等比较方法
Where 根据制定条件对集合中元素进行筛选,返回满足条件的元素集合
Skip 跳过序列中指定数量的元素,然后返回剩余的元素
SkipWhile 跳过序列中满足指定条件的元素,然后返回剩余的元素,可以指定条件判断方法
Take 从序列的开头返回指定数量的连续元素
TakeWhile 返回从序列开始的满足指定条件的连续元素,可以指定条件判断方法
ToArray 从IEnumerable<T>创建一个数组
ToList 从IEnumerable<T>创建一个List<T> 从上表可以看出,IEnumerable<T>提供的方法包括数值运算(Sum、Min、Max、Average)、元素数量(Count、LongCount)、取值(First、Last、ElementAt等)、提取子集(Skip、SkipWhile、Take、TakeWhile、)集合操作(Reverse、Concat、Distinct、Except、Intersect、Union、SequenceEqual等)。这些方法提供了LINQ所需要的所有操作。注意:IEnuerable<T>继承自IEnumerable<T>接口,所以它也包含IEnumerable接口的所有方法,所以还包括Select()、SelectMany()、Repeat()等方法。另外,IQuery<T>接口从IEnumerable<T>派生而来,通常也可以作为数据源使用,它的使用和IEnumerable<T>类似。
参考技术A 楼主您好!
非常荣幸看到您的问题!
但是遗憾的是到现在还没有人回答您的问题,可能是您问的问题有些专业了,我和团队的朋友都不会,都帮不到您!也有可能是别人没有遇到或者接触过您的问题,所以帮不了您。
建议您去相关的问题论坛求助,那里的人通常比较多,也比较热心,可能帮得到您!
如果您现在已经在别的地方找到了您想要的答案,或者自己想出来了,那就恭喜您了!o(∩_∩)o

C#泛型

  

1.泛型与其他类型作对比:

  我们现在要求实现一个类

  (1)一般声明类

   public class Stack

  
    private int[] m_item;
    public int Pop() return 0
    public void Push(int itme)
    public Stack(int i)
    
      this.m_item = new int[i];
    
  

  以上代码缺点是只能处理一种数据类型(int),换个string类型就不行了。

  (2)优秀的程序员想到用一个通用数据类型object来实现这个类

  public class Stack

  
    private object[] m_item;
    public object Pop() return 0
    public void Push(object itme)
    public Stack(object i)
    
      this.m_item = new object[i];
    
  

  这个类写的不错,非常灵活,但是在处理数据时,若数据量大,则会出现不断地装箱和拆箱操作,这将在托管堆上分配和回收大量的变量,则性能损失非常严重。

  (3)使用泛型

  

  public class Stack<T>

  
    private T[] m_item;
    public T Pop() return 0
    public void Push(T itme)
    public Stack(T i)
    
      this.m_item = new T[i];
    
  

  此类就解决了装箱和拆箱频繁带来的性能损失问题。

2.方法对比

  以下为int和string类型的比较方法

  public class CompareClass
  

    //整数比较
    public static int CompareInt(int value1, int value2)
    
      if (value1.CompareTo(value2) > 0)
        return value1;
      else
        return value2;
    
    //字符串比较
    public static string CompareInt(string value1, string value2)
    
      if (value1.CompareTo(value2) > 0)
        return value1;
      else
        return value2;
    

  

  以上代码对于不同类型要不同处理,此时可以写为泛型:

  public class CompareClass<T> where T : IComparable
  
    public static T CompareValue(T value1, T value2)
    
      if (value1.CompareTo(value2) > 0)
        return value1;
      else
        return value2;
    

  

3.时间消耗对比

  (1)不用泛型代码

  public static void TestGeneric()
  
    Stopwatch stopwatch = new Stopwatch();

    //ArrayList不是泛型
    ArrayList array = new ArrayList();
    stopwatch.Start();
    for (int i = 0; i < 10000000; i++)
    
      array.Add(i);
    
    stopwatch.Stop();
    Console.WriteLine(stopwatch.Elapsed);
  

  (2)用泛型代码

  public static void TestGeneric()
  
    Stopwatch stopwatch = new Stopwatch();

    //List<int>为泛型
    List<int> gelist = new List<int>();
    stopwatch.Start();
    for (int i = 0; i < 10000000; i++)
    
      gelist.Add(i);
    
    stopwatch.Stop();
    Console.WriteLine(stopwatch.Elapsed);
  

  (1)耗时2秒多,(2)耗时几百毫秒

4.使用泛型的好处:

  (1)泛型能够实现代码复用

  (2)泛型能够减少装箱拆箱操作,避免性能损失

  (3)减少处理器的负担,加快运行速度

 

以上是关于C#定义一个泛型集合类。要求:实现Ienumerable<T>接口,T是值类型,并T取2个类型分别测试。的主要内容,如果未能解决你的问题,请参考以下文章

C#实体类中如何定义泛型集合类型的属性?

C#实体类中如何定义泛型集合类型的属性

c#中泛型集合怎样写强制类弄转换

C#笔记(十四)——接口泛型

实体类的理解

C#语言基础——集合(ArrayList集合)