【问题标题】:Where is this method declared?这个方法在哪里声明?
【发布时间】:2015-11-17 22:00:31
【问题描述】:

我正在寻找C#的细线代码,我找到的链接如下

Zhang-Suen thinning algorithm C#

最后一个答案有一系列代码,其中一部分是深度克隆功能,

public static T[][] ArrayClone<T>(T [][] A) 
{ 
     return A.Select(a => a.ToArray()).ToArray();
}

有人知道A 是什么类吗?因为当我尝试使用此代码时,A.Select 不起作用,因为我从未创建过此类,并且代码没有提到这一点。有没有其他方法可以细化线?

【问题讨论】:

  • A 是给定类型 T 的双精度数组。由于数组被视为Collection 的子类,因此它们公开了Select 方法。还有很多其他方法可以实现这一点,包括一个双嵌套的 for 循环来遍历所有元素并将它们复制到一个新的数组数组中。
  • 您是否将using System.Linq; 与您的其他usings 一起添加?这就是引入像 Select() 这样的 Linq 扩展方法的原因。
  • bool[][] s ;请参阅 ZhangSuenThinning 标头及以下!
  • 请注意,您的最后一个问题“是否有任何其他方法可以细化线条” 与您似乎拥有的主要问题完全不同。谷歌比 Stack Overflow 更好地回答

标签: c#


【解决方案1】:

“不起作用”是什么意思具体?如果您收到“不包含定义……并且无法找到扩展方法……”消息,那么您所缺少的只是您要使用代码的模块顶部的using System.Linq;

请注意,A 根本不是一个类。它是参数的名称。恕我直言,这是为什么人们应该遵循更好的编码约定的一个很好的例子。我们习惯于看到大写的类型名称,当有人用大写写一个变量时,很难识别它是一个变量,即使理论上应该清楚它只是基于它的位置(编译器没有麻烦,但人类有很多麻烦)。

也许这个版本的方法会让实际发生的事情更清楚:

public static T[][] ArrayClone<T>(T [][] array) 
{ 
     return array.Select(subArray => subArray.ToArray()).ToArray();
}

即你有一个名为ArrayClone 的通用方法。此方法的泛型类型参数是T。此方法的唯一参数名为array(在您查看的版本中为A),参数的类型为T[][],其中T 是任何类型的编译时基数组类型实际传递给方法的对象。

另一种编写方法的方式是这样的:

public static T[][] ArrayClone<T>(T [][] array) 
{ 
     return System.Linq.Enumerable.ToArray(
         System.Linq.Enumerable.Select(array,
             subArray => System.Linq.Enumerable.ToArray(subArray)));
}

即如果没有 using 指令使扩展方法可见,您可以直接调用静态方法。它在System.Linq.Enumerable 类中实现。

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多