C# 如何解析列表或二维数组,因为IEnumerable<;T>;不';不行?

C# 如何解析列表或二维数组,因为IEnumerable<;T>;不';不行?,c#,C#,对不起,这个问题让人困惑,但我真的不知道如何更好地提出它。 也许一些代码可以更好地可视化我的问题 我一开始拥有的 实际问题 是否有IEnumerable以外的方法来解决此问题?使用IEnumerable并手动强制转换它。二维阵列不实现通用版本 IEnumerable<Field> fields = ((IEnumerable)myArray).Cast<Field>(); IEnumerable字段=((IEnumerable)myArray.Cast(); 使用IEn

对不起,这个问题让人困惑,但我真的不知道如何更好地提出它。 也许一些代码可以更好地可视化我的问题

我一开始拥有的 实际问题
是否有IEnumerable以外的方法来解决此问题?

使用
IEnumerable
并手动强制转换它。二维阵列不实现通用版本

IEnumerable<Field> fields = ((IEnumerable)myArray).Cast<Field>();
IEnumerable字段=((IEnumerable)myArray.Cast();

使用
IEnumerable
并手动强制转换。二维阵列不实现通用版本

IEnumerable<Field> fields = ((IEnumerable)myArray).Cast<Field>();
IEnumerable字段=((IEnumerable)myArray.Cast();

您可以用传统的方式亲自编写迭代:

在调用函数中,声明如下:

Field[,] Fields = new Field[4,5];
将方法签名更改为:

public static void drawFields(Image img, Field[,] fields, bool clear)
然后对循环进行编码:

for (int i = 0; i < fields.GetLength(0); ++i)
    for (int j = 0; j < fields.GetLength(1); ++j)
    {
        Field f = fields[i, j];
        grx.DrawImage(img, f.x * Field.width, f.y * Field.height);
    }
for(int i=0;i
您可以用传统的方式亲自编写迭代:

在调用函数中,声明如下:

Field[,] Fields = new Field[4,5];
将方法签名更改为:

public static void drawFields(Image img, Field[,] fields, bool clear)
然后对循环进行编码:

for (int i = 0; i < fields.GetLength(0); ++i)
    for (int j = 0; j < fields.GetLength(1); ++j)
    {
        Field f = fields[i, j];
        grx.DrawImage(img, f.x * Field.width, f.y * Field.height);
    }
for(int i=0;i
您可以使用
IEnumerable
并在for循环中强制转换

private void drawFields(Image img, IEnumerable Fields , bool clear)
{            
    Graphics grx = Graphics.FromImage(pictureBox1.Image);
    if(clear)
        grx.Clear(Color.White);
    foreach(object o in Fields)
    {
        var f = (Field)o;
        grx.DrawImage(img, f.x * Field.width, f.y * Field.height);
    }
}

您可以使用
IEnumerable
并在for循环中强制转换

private void drawFields(Image img, IEnumerable Fields , bool clear)
{            
    Graphics grx = Graphics.FromImage(pictureBox1.Image);
    if(clear)
        grx.Clear(Color.White);
    foreach(object o in Fields)
    {
        var f = (Field)o;
        grx.DrawImage(img, f.x * Field.width, f.y * Field.height);
    }
}

第二种方法是编写自己的枚举器类,以完成从数组到简单枚举的转换

免责声明:我没有测试此代码来检查它在您的情况下是否有效,但它应该用于说明原理

class FieldEnumerator : IEnumerable<Field>
{
    Field[,] array;
    public FieldEnumerator(Field[,] array)
    {
        this.array = array;
    }
    public IEnumerator<Field> GetEnumerator()
    {
        for (int i = 0; i < this.array.GetLength(0); ++i)
            for (int j = 0; j < this.array.GetLength(1); ++j)
            {
                yield return this.array[i, j];
            }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

然后是你的方法

private void drawFields(Image img, IEnumerable<Field> Fields, bool clear)
private void绘图字段(图像img、IEnumerable字段、布尔清除)

保持不变。

第二种方法是编写自己的枚举器类,以完成从数组到简单枚举的转换

免责声明:我没有测试此代码来检查它在您的情况下是否有效,但它应该用于说明原理

class FieldEnumerator : IEnumerable<Field>
{
    Field[,] array;
    public FieldEnumerator(Field[,] array)
    {
        this.array = array;
    }
    public IEnumerator<Field> GetEnumerator()
    {
        for (int i = 0; i < this.array.GetLength(0); ++i)
            for (int j = 0; j < this.array.GetLength(1); ++j)
            {
                yield return this.array[i, j];
            }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

然后是你的方法

private void drawFields(Image img, IEnumerable<Field> Fields, bool clear)
private void绘图字段(图像img、IEnumerable字段、布尔清除)


保持不变。

我可能误解了您的意思,但对我来说,您似乎试图将2D数组视为只有一个维度。不,我只想在2D数组上应用相同的函数。foreach循环工作得非常好。但是我有两个函数,它们的主体相同,只是标题不同。我可能误解了你,但对我来说,你似乎试图将2D数组视为只有一个维度。不,我只想在2D数组上应用相同的函数。foreach循环工作得非常好。但是我有两个相同主体的函数,只是标题不同。我认为与简单的自我转换相比,转换使用了大量的cpu。@lorenz“思考”还是“假设”?你量过了吗?我读过约翰·斯基特(john skeet)的一篇文章,他在那里使用了cast,这是迄今为止速度最慢的。但它可能不适用于这种情况。很有效,谢谢你。我现在要坚持下去。缺少一个使用方向强制转换的主要问题是每个元素都会取消绑定,而且取消绑定可能会很慢。我认为强制转换与简单的自行转换相比使用了大量cpu。@lorenz“思考”还是“假设”?你量过了吗?我读过约翰·斯基特(john skeet)的一篇文章,他在那里使用了cast,这是迄今为止速度最慢的。但它可能不适用于这种情况。很有效,谢谢你。我现在要坚持下去。缺少使用方向强制转换的主要问题是每个元素都会取消绑定,而且取消绑定可能会很慢。既然foreach循环正在工作,为什么我不继续使用它呢?我想你误解我了。我想更改标题,使其接受2D数组和列表。您的问题是基于它不起作用,但至少对2D数组不起作用。@lorenzalbert您在这里基本上有两个现实的选择。使用ClickRick的答案,不需要强制转换,或者使用addy2012的答案,执行强制转换,并保留方法主体。不起作用的是标题。身体很好;)既然foreach循环正在工作,为什么不继续使用它呢?我想你误解我了。我想更改标题,使其接受2D数组和列表。您的问题是基于它不起作用,但至少对2D数组不起作用。@lorenzalbert您在这里基本上有两个现实的选择。使用ClickRick的答案,不需要强制转换,或者使用addy2012的答案,执行强制转换,并保留方法主体。不起作用的是标题。身体很好;)这看起来很不错,因为我到现在为止还没有和IEnumerator做过任何事情。既然你使用的是yield,你就不能去掉这个类,只使用GetEnumerator()方法,将数组传递给它吗?这看起来很不错,因为我到目前为止还没有用IEnumerator做过任何事情。既然您使用的是yield,您就不能去掉这个类,只使用GetEnumerator()方法,将数组传递给它吗?