【问题标题】:Stop IEnumerable from enumerating through all elements [closed]停止 IEnumerable 枚举所有元素 [关闭]
【发布时间】:2016-01-11 22:08:14
【问题描述】:

如何阻止IEnumberable 枚举相关变量中的所有元素。 我有一个函数,我将IEnumerable 列表传递给它,它总是只有两个元素。但是,我需要该函数仅针对第一个元素运行,不多也不少。如何让它只通过第一个元素?

注意:由于只有两个元素,我尝试将它们分别传入(例如doubledouble),但它仍然贯穿两者。

【问题讨论】:

  • 你能展示你的代码吗?
  • 为什么不能使用.First().FirstOrDefault() 来获取列表中的第一项?甚至list[0]?
  • 你为什么还要遍历可枚举?如果它总是有两个元素(你怎么确定?)并且你只想要第一个元素,只需定位第一个元素......
  • 如果变量总是包含两个项目的集合,为什么不使用 Tuple 而不是 IEnumerable?
  • @yacoubMassad public List<IdentifiedBoard> FindBoards(IEnumerable <SimpleProfile> profile) ...这就是传入的内容。

标签: c# ienumerable


【解决方案1】:

您可以使用Take 方法执行以下操作:

profile = profile.Take(1);

现在,当您枚举profile 时,您将只经过一项。

【讨论】:

  • 改用FirstFirstOrDefault 可能有用,这样你得到T 而不是IEnumerable<T>(即使它保证有0..1 项)
  • @Rob - FirstFirstOrDefault 不返回 IEnumerable<T>,它们返回对象的实例。该方法需要IEnumerable<T> OP 可以更改方法以接受T 的实例,然后按照您的建议进行操作。
  • @ChrisDunaway 这正是我所说的,您应该使用First* 以便获得T,而 IEnumerable<T>。我会假设这也可能在接受 IEnumerable<T> 的方法中(如果更改声明是不可能的)。
  • @Rob,你是对的。我直接回答了如何“阻止 IEnumerable 枚举所有元素”,我认为这样做的方法是让 IEnumerable 通过Take(1) 仅通过一个元素。
  • 谢谢,它成功了:) ...我不明白为什么会有负面影响:/
【解决方案2】:

以下代码显示:

返回 0

这确认实际上只有一个项目已被评估。

public static void Main()
{
    var numbers = GetNumbers(2);

    var result = numbers.Take(1);

    // Evaluate only first number
    result.ToArray();       
}

public static IEnumerable<int> GetNumbers(int max)
{
    for(int i = 0; i < max; i++) 
    {
        Console.WriteLine("Returning {0}", i); 
        yield return i;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多