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()方法,将数组传递给它吗?