【问题标题】:How to loop through a collection that supports IEnumerable?如何遍历支持 IEnumerable 的集合?
【发布时间】:2023-03-09 15:48:01
【问题描述】:

如何遍历支持 IEnumerable 的集合?

【问题讨论】:

    标签: c# for-loop foreach ienumerable


    【解决方案1】:

    每个人都有一个常客:

    foreach (var item in collection)
    {
        // do your stuff   
    }
    

    【讨论】:

    • 这比 .ElementAt() 快。不幸的是,我的投票被锁定在 Alexa 的答案上,所以我无法撤消它,但这是最好的答案。 +1
    • 那么你如何修复“IEnumerable 的可能多重枚举”?
    • @SharpC:最简单的方法是将结果提取到 List 或数组中,然后将其传递到需要对其进行迭代的各个地方。这保证了结果的(可能很昂贵)枚举只发生一次,但代价是将结果存储在内存中。我的第一步是找出多重枚举是否真的有问题。
    【解决方案2】:

    除了已经建议的使用foreach 循环的方法外,我还想我还提到任何实现IEnumerable 的对象也通过GetEnumerator 方法提供IEnumerator 接口。虽然这种方法通常不是必需的,但它可以用于手动迭代集合,并且在为集合编写自己的扩展方法时特别有用。

    IEnumerable<T> mySequence;
    using (var sequenceEnum = mySequence.GetEnumerator())
    {
        while (sequenceEnum.MoveNext())
        {
            // Do something with sequenceEnum.Current.
        }
    }
    

    一个典型的例子是当您想要同时迭代 两个序列时,这对于 foreach 循环是不可能的。

    【讨论】:

    • 别忘了配置枚举器。
    • @Eric:是的,我会添加它,因为它很容易错过。
    • 我认为这仅适用于 IEnumerable 对象,不适用于 IEnumerable。我有一个通用案例,我必须强制转换为 IEnumerable,因此,我没有可用的 GetEnumerator 方法。无论如何,对于大多数情况来说都很好。
    • 这应该是公认的答案
    【解决方案3】:

    甚至是非常经典的老式方法

    using System.Collections.Generic;
    using System.Linq;
    ...
    
    IEnumerable<string> collection = new List<string>() { "a", "b", "c" };
    
    for(int i = 0; i < collection.Count(); i++) 
    {
        string str1 = collection.ElementAt(i);
        // do your stuff   
    }
    

    也许你也想要这个方法:-)

    【讨论】:

    • 为什么会有这么多赞?这将枚举可枚举的 2n 次而不是一次。
    • @RomanReiner 因为这行得通,有些人不关心性能:)
    • @RomanReiner 这是一个很好的例子,我需要将一个集合的每个元素分配给另一个集合,我想我不能使用 foreach 来做到这一点
    • 如果您查看 ElementAt 的实现,您会发现如果集合是 IList,它们会使用 []; 返回索引处的元素;但是,与 [] 的性能相同;如果没有,他们将获取 Enumerator 并在返回之前依次开始迭代查找元素,因此基本上为每个元素创建一个新的枚举器并再次导航列表...
    • 更糟糕的是,IEnumerable 不支持 Count() 或 ElementAt()。我认为他正在考虑一个 IList。这实际上根本没有回答这个问题。
    【解决方案4】:
    foreach (var element in instanceOfAClassThatImplelemntIEnumerable)
    {
    
    }
    

    【讨论】:

      【解决方案5】:

      使用扩展:

      namespace MyCompany.Extensions
      {
          public static class LinqExtensions
          {
              public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> actor) { foreach (var x in source) { actor(x); } }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多