`
pcajax
  • 浏览: 2162324 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IEnumerable

阅读更多

在平常的代码编写中,虽然不常用到Ienumerable 但却不可不知他的意义,有些时候使用会起到意想不到的作用,

我们从中可以知道 foreach 在IL中,是以Ienumberable 来体现的。

IEnumerable和IEnumerable
   主要实现  public IEnumerator GetEnumerator()
C# 1.0中的foreach

没有迭代器的时候,创建一个可用于foreach的集合(C# 1.0):

public class MyCollection : IEnumerable
{ <script language="JavaScript" src="http://book.book560.com/ads/ads728x15.js" type="text/javascript"></script>
  public MyEnumerator GetEnumerator()
  {
   return new MyEnumerator(this);
  }
  public class MyEnumerator : IEnumerator
  {
   public void Reset(){...}
   public bool MoveNext(){...}
   public int Current{ get{...} }
   object IEnumerator.Current{ get{...} }
  }
}

对集合使用foreach语句:
  foreach(int i in col){...}

相单于:
IEnumerator etor = ((IEnumerable)col).GetEnumerator();
try
{
  while(etor.MoveNext())
  {
   ElementType clem (ElementType)etor.Current;
   ...;
  }
}
finally{(IDisposable)enumerator).Dispose();}

C# 2.0 中的迭代器

使用迭代器创建于foreach的集合(C# 2.0):

public class Stack:IEnumerable
{
  T[] items;
  int count;
  public void Push(T data){...}
  public T Pop(){...}
  public IEnumerator GetEnumerator()
  {
   for(int i=count-1;i>=0;--i)
   {
     yield return items[i];
   }
  }
}

使用foreach语句:

Stack stack = new Stack();
foreach(int i in statck){...}

<script language="JavaScript" src="http://book.book560.com/ads/ads728x15.js" type="text/javascript"></script>

数据源转成IEnumerable类型

//将数据源中的数据都转换为IEnumerable类型,用作数据绑定

//其中_dataSource为数据源,DataMember为要找的数据名称

  protected virtual IEnumerable GetDataSource()
  {
   if(_dataSource == null)
   {
    return null;
   }
   IEnumerable resolvedDataSource = _dataSource as IEnumerable;
   if(resolvedDataSource != null)
   {
    return resolvedDataSource;
   }

   IListSource listSource = _dataSource as IListSource;
   if(listSource != null)
   {
    IList memberList = listSource.GetList();
    int i = memberList.Count;
    if(listSource.ContainsListCollection == false)
    {
     return (IEnumerable)memberList;
    }

    ITypedList typedMemberList = memberList as ITypedList;
    if(typedMemberList != null)
    {
     PropertyDescriptorCollection propDescs = typedMemberList.GetItemProperties(new PropertyDescriptor[0]);
     PropertyDescriptor memberProperty = null;
     if((propDescs != null) && (propDescs.Count!=0))
     {
      string dataMember = DataMember;
      if(dataMember.Length == 0)
      {
       memberProperty = propDescs[0];
      }
      else
      {
       memberProperty = propDescs.Find(dataMember,true);
      }

      if(memberProperty != null)
      {
       object listRow = memberList[0];
       object list = memberProperty.GetValue(listRow);

       if(list is IEnumerable)
       {
        return (IEnumerable)list;
       }
      }
      throw new Exception("no Datamember.");
     }
     throw new Exception("no datamember.");
    }
   }
   return null;
  }

分享到:
评论

相关推荐

    C# 简单分页,支持数据源DataTable和IEnumerable SourceCode

    本主题将深入探讨如何使用C#实现简单分页,同时支持两种常用的数据源:`DataTable`和`IEnumerable`。 首先,让我们了解分页的基本概念。分页是将大数据集拆分成多个较小的、可管理的部分,每个部分称为一个“页”。...

    C#中的IEnumerable接口深入研究

    【C#中的IEnumerable接口深入研究】 在.NET框架中,`IEnumerable&lt;T&gt;`接口是序列化数据的核心,它使得遍历集合变得简单而高效。这个接口定义了一个`GetEnumerator`方法,用于返回一个枚举器实例,该枚举器可以依次...

    IEnumerable<T>、IEnumerable、ICollection<T>、IList<T>、ObservableCollectin<T>和Collection<T>得关系。

    本文将详细解释`IEnumerable&lt;T&gt;`、`IEnumerable`、`ICollection&lt;T&gt;`、`IList&lt;T&gt;`、`ObservableCollectin&lt;T&gt;`以及`Collection&lt;T&gt;`之间的关系。 首先,`IEnumerable&lt;T&gt;`接口是基础,它定义了一个可以被枚举(即遍历)...

    C#自建类实现集合接口IEnumerable, IEnumerator

    ### C#自建类实现集合接口 `IEnumerable` 和 `IEnumerator` 在C#中,自定义一个集合类并使其能够支持常见的集合操作(如迭代、添加、删除等)是非常实用的功能。下面将详细介绍如何通过实现 `IEnumerable` 和 `...

    用于在ASP.NET中轻松分页任何IEnumerable IQueryable的库.zip

    【标题】中的“用于在ASP.NET中轻松分页任何IEnumerable IQueryable的库”指的是一个特定的开发工具或库,它使得开发者在使用ASP.NET框架时,能够便捷地对数据进行分页处理。在Web开发中,分页是常见的功能,尤其在...

    IEnumerable<T>、ICollection<T>、IList<T>、ObservableCollectin<T>和Collection<T>的关系

    在.NET框架中,`IEnumerable&lt;T&gt;`、`ICollection&lt;T&gt;`、`IList&lt;T&gt;`、`ObservableCollection&lt;T&gt;`和`Collection&lt;T&gt;`是几个重要的泛型接口和类,它们在处理集合数据时扮演着不同的角色,提供了不同程度的功能和性能优化。...

    C# IEnumerable和IEnumerator接口浅析

    Foreach常用于循环访问集合,对实现IEnumerable的接口的容器进行遍历,IEnumerable和IEnumerator接口我有时候也有点迷糊,按官方的解释,IEnumerable是枚举器接口,IEnumerator是迭代器接口,从字面意思来看相差不大...

    C#中IEnumerable、ICollection、IList、List之间的区别

    在C#编程语言中,`IEnumerable&lt;T&gt;`、`ICollection&lt;T&gt;`、`IList&lt;T&gt;`以及`List&lt;T&gt;`是四个常见的接口和类,它们都与集合操作密切相关,但各自具有不同的特性和用途。以下是对这些概念的详细解释: 1. **IEnumerable**...

    IEnumerable转DataTable

    该方法适用于ASP.NET MVC4的IEnumertable数据类型转换成DataTable数据类型

    C#中的IEnumerable简介及简单实现实例

    在C#编程语言中,`IEnumerable`接口是一个非常重要的组件,它是所有可枚举类型的基础。这个接口允许程序员遍历集合中的元素,无论是数组、列表还是自定义数据结构。`IEnumerable`接口存在于`System.Collections`命名...

    使用C#将DataReader转换为IEnumerable

    在.NET框架中,数据访问是开发过程中的关键环节,而`DataReader`和`IEnumerable`都是在处理数据库查询结果时常用的数据结构。`DataReader`是一种高效、流式的数据访问接口,通常用于从数据库读取大量数据,而`...

    C#中IEnumerable接口用法实例分析

    C#中的IEnumerable接口是.NET框架中用于迭代集合的重要接口,它允许程序遍历任何可枚举类型的数据结构,如数组、列表或者自定义集合。这个接口定义了一个枚举器(enumerator)的概念,使得开发者能够逐个访问集合中...

    c# 省市区集成模块【支持延迟加载异步回调】

    void ActivationEventBeginInvoke(Func&lt;int&gt; id,Action&lt;IEnumerable&lt;T&gt;&gt; TValue = null, Action&lt;IAsyncResult&gt; Ting=null); IEnumerable&lt;T&gt; GetChildList(); void GetChildList(Action&lt;IEnumerable&lt;T&gt;&gt; TValue)...

    Array.js:IEnumerable用于javascript数组

    Array.js IEnumerable用于javascript数组 var source = [{ Id: 1, Name: 'Item 1' }, { Id: 2, Name: 'Item 2' }, { Id: 3, Name: 'Item 3' }, { Id: 4, Name: 'Item 4' }, { Id: 5, Name: 'Item 5' }, { Id: 6, ...

    NPOI.Extension:此存储库包含NPOI的扩展名,该扩展名提供了IEnumerable 已保存并从excel功能加载

    提供IEnumerable 的NPOI扩展已保存到Excel功能并从中加载。进口将支持将来的功能,并且仅支持Fluent API 。 此存储库中发现的所有问题将仅由,因此,请更新您的代码以使用FluentExcel 。特征 使用fluent api将配置与...

Global site tag (gtag.js) - Google Analytics