实现IEnumerable,但避免'MyClass'不实现接口成员'IEnumerable.GetEnumerator()'
Implement IEnumerable, but avoid 'MyClass' does not implement interface member 'IEnumerable.GetEnumerator()'
我有一个自定义 class,它的核心是一个浮点数列表。在应用程序的其他地方,我想用 ForEach 遍历它,所以在 class 定义上,我试图只实现 IEnumerable。但是当我这样做时,我被告知:
'MyClass' does not implement interface member 'IEnumerable.GetEnumerator()'
我理解错误。我只是想知道是否有解决方法,除了在 MyClass 中实际实现 GetEnumerator。
如果您想避免手动实现 IEnumerable,该语言支持一些语法糖,可以自动为您生成大部分语法糖。它没有在你的 class 上实现 IEnumerable<>
(如果你想要它,你必须实现它,就像其他人所说的那样),但它很接近。
public class MyClass
{
private bool TryGetNextFloat(out float nextFloat) {/* Whatever */};
public IEnumerable<float> AsEnumerable()
{
float nextFloat = 0;
while(this.TryGetNextFloat(out nextFloat))
{
yield nextFloat;
}
}
}
// Elsewhere
foreach (var f in myClassInstance.AsEnumerable())
{
// Do something with f
}
(请注意,如果您的 class 中有可枚举的浮点数,这是一个微不足道的问题,您可以简单地 return 将其作为 IEnumerable。)
我有一个自定义 class,它的核心是一个浮点数列表。在应用程序的其他地方,我想用 ForEach 遍历它,所以在 class 定义上,我试图只实现 IEnumerable。但是当我这样做时,我被告知:
'MyClass' does not implement interface member 'IEnumerable.GetEnumerator()'
我理解错误。我只是想知道是否有解决方法,除了在 MyClass 中实际实现 GetEnumerator。
如果您想避免手动实现 IEnumerable,该语言支持一些语法糖,可以自动为您生成大部分语法糖。它没有在你的 class 上实现 IEnumerable<>
(如果你想要它,你必须实现它,就像其他人所说的那样),但它很接近。
public class MyClass
{
private bool TryGetNextFloat(out float nextFloat) {/* Whatever */};
public IEnumerable<float> AsEnumerable()
{
float nextFloat = 0;
while(this.TryGetNextFloat(out nextFloat))
{
yield nextFloat;
}
}
}
// Elsewhere
foreach (var f in myClassInstance.AsEnumerable())
{
// Do something with f
}
(请注意,如果您的 class 中有可枚举的浮点数,这是一个微不足道的问题,您可以简单地 return 将其作为 IEnumerable。)