【问题标题】:How to retrieve the elements in list without using foreach loop in C#?如何在不使用 C# 中的 foreach 循环的情况下检索列表中的元素?
【发布时间】:2010-02-16 04:11:49
【问题描述】:

如何在不使用 foreach 循环的情况下从列表中检索元素?

【问题讨论】:

  • 我想知道你为什么不想使用 foreach。它可能会揭示一个细节,有助于我们更好地回答您的问题。
  • 你想做什么?为什么不能使用foreach?列表索引器呢?
  • 我喜欢使用迭代器检索
  • foreach(枚举器)背后的概念与迭代器相同。你不应该试图避免它。
  • 迭代器的使用方式是foreach。这实际上被编译为对 GetEnumerator() 的调用和使用该枚举器的循环

标签: c# linq list


【解决方案1】:
var list = new List<int> { 1, 2, 3, 4, 5 };
for (int i = 0; i < list.Count(); i++)
{
    var element = list[i];
}

var list = new List<int> { 1, 2, 3, 4, 5 };
using (var enumerator = list.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        var element = enumerator.Current;
    }
}

【讨论】:

  • 别忘了配置枚举器。
【解决方案2】:

您说的是列表,但您没有将 List&lt;T&gt; 类指定为 this answer assumes(另外,可能会添加该答案使用 Count() 扩展方法。因为您知道类型是 List&lt;T&gt;最好使用 Count 属性)。

如果您一直在使用IList&lt;T&gt; 接口实现,那么使用迭代索引然后访问具有该值的索引器的 for 循环将可以正常工作。

但是,如果您正在处理 IEnumerable&lt;T&gt; 实现,那并不总是有效。相反,您必须执行以下操作:

// Get the IEnumerator<T> from the list.
IEnumerator<T> enumerator = list.GetEnumerable();

// Dispose if necessary.
using (enumerator as IDisposable)
{
    // Cycle while there are items.
    while (enumerator.MoveNext())
    {
        // Work with enumerator.Current here.
    }
}

这是编译器在编译时扩展 foreach 语句的方式。基本上,由于IEnumerable&lt;T&gt; 实现可以实现 IDisposable,它通过尝试强制转换为 IDisposable 来为这种可能性做准备。如果不能,那么 using 语句在退出时不会做任何事情。

在数组上使用 foreach 时,编译器将扩​​展为一个循环,该循环通过索引访问项目(假设您直接使用数组实例),而不是上面的枚举器方法。

【讨论】:

    【解决方案3】:

    如果您想避免这种类型的循环:

     foreach(var item in list) {};
    

    ...那么您可以使用 Linq 或 Lambda 表达式从列表中搜索和检索。

    例如:

      using System.Linq;
    
      // ... with Lambda
      var ints = new List<int>(){1,2,3,4,5};
      var evenInts = ints.ForEach(i => i % 2 == 0);
    
      // with straight Linq-to-objects:
      var oddInts = from i in ints
          where i % 2 == 1
          select i;
    

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2013-02-27
      • 2022-01-22
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多