gpt4 book ai didi

c# - 实现集合的简单方法?

转载 作者:行者123 更新时间:2023-11-30 19:20:28 24 4
gpt4 key购买 nike

我正在开发一个集合类,它应该实现 IEnumerator 和 IEnumerable。

在我的第一种方法中,我直接实现了它们。现在我发现了 yield 关键字,并且我已经能够简化所有事情,将 IEnumerator/IEnumerable 接口(interface)替换为只读属性 Values,该属性值使用 yield 在循环中返回 IEnumerable。

我的问题:是否可以使用 yield 来迭代类本身,而无需实现 IEnumerable/IEnumerator?

也就是说,我想要一个类似于框架集合的功能:

List<int> myList = new List<int>();
foreach (int i in myList)
{
...
}

这可能吗?

更新:我的问题似乎措辞不当。我不介意实现 IEnumerator 或 IEnumerable;我只是认为唯一的方法是使用旧的 Current/MoveNext/Reset 方法。

最佳答案

您将 实现IEnumerable<T>IEnumerable得到foreach工作 - 但这样做是个好主意。这很容易做到:

public class Foo : IEnumerable<Bar>
{
public IEnumerator<Bar> GetEnumerator()
{
// Use yield return here, or
// just return Values.GetEnumerator()
}

// Explicit interface implementation for non-generic
// interface; delegates to generic implementation.
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

没有实现的替代方案 IEnumerable<T>只会调用你的Values属性(property),但仍提供 GetEnumerator()方法:

public class Foo
{
public IEnumerator<Bar> GetEnumerator()
{
// Use yield return here, or
// just return Values.GetEnumerator()
}
]

虽然这会起作用,但这意味着您将无法将您的收藏传递给任何期待 IEnumerable<T> 的人。 ,例如 LINQ to Objects。

鲜为人知的事实是foreach适用于任何支持 GetEnumerator() 的类型返回具有适当 MoveNext() 类型的方法和 Current成员。这实际上是为了在泛型之前允许强类型集合,在泛型上迭代集合不会装箱值类型等。现在真的不需要它了,IMO。

关于c# - 实现集合的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6136019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com