1

早上好,

我来自 Python 环境并转向 C#。

我将更宽的列表拆分为具有规定长度的更窄的列表。

有没有办法简化下面的代码?我的猜测是它有点慢,并且没有正确遵循 c# 通用编码规则。

List<object> B = new List<object>();
for(int i = 0; i < SD_Data.Count / 314; i++) {
  var SD_Input = SD_Data.Skip(314 * i).Take(314 * i + 313);
  B.Add(SD_Input);
}

A = B;

我发现了这个有用的方法

public static IEnumerable<IEnumerable<T>> Chunk<T > (this IEnumerable<T> source, int chunksize)
{
  while (source.Any())
  {
    yield return source.Take(chunksize);
    source = source.Skip(chunksize);
  }      
}
var z = Chunk(x, 10);

但它确实引发了以下错误:

Error (CS1513): } expected (line 69)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 88)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 88)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 89)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 89)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 90)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 91)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 92)
Error (CS1518): Expected class, delegate, enum, interface, or struct (line 94)
Error (CS1001): Identifier expected (line 112)
Error (CS1001): Identifier expected (line 114)
Error (CS1022): Type or namespace definition, or end-of-file expected (line 115)

我正在研究 McNeel 的 Rhinoceros 软件的 Grasshopper 界面。

提前致谢!

4

3 回答 3

1

我终于弄明白了。

这个线程对我帮助很大。

在 Grasshopper 3D 中使用 C# 组件处理数组/列表

由于该方法是在另一个方法(即 RunScript)中定义的,因此引发了该问题。解决办法是写在

// <Custom additional code>

code here

// <Custom additional code>

所以结果是:

 private void RunScript(List<Point3d> SrcPts, List<string> Instrument, List<object> SD_Data, List<double> XY_Angles, List<string> Octave, ref object A, ref object B)
  {
    B = Chunk(SD_Data, 314);
  }

  // <Custom additional code> 

  public static IEnumerable<IEnumerable<T>> Chunk<T > (IEnumerable<T> source, int chunksize)
  {
    while (source.Any())
    {
      yield return source.Take(chunksize);
      source = source.Skip(chunksize);
    }
  }
  // <Custom additional code>

感谢大家的宝贵建议。

于 2016-08-04T21:47:54.797 回答
0

this如果要以标准方式调用 Chunk 方法,请删除关键字

public static IEnumerable<IEnumerable<T>> Chunk<T > (IEnumerable<T> source, int chunksize)
{
  while (source.Any())
  {
    yield return source.Take(chunksize);
    source = source.Skip(chunksize);
  }      
}
于 2016-08-03T14:59:15.080 回答
0

使用该方法的语法如下:

var B = SD_Data.Chunk(314);

Chunk 被声明为Extension Method

于 2016-08-03T14:05:30.090 回答