- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
具有 IEnumerable 接口(interface)的类在编译时出错。
扩展方法必须在非泛型静态类中定义
请帮忙。我不希望这个类是静态的,这会导致更多的错误(不能在静态类中定义一些东西)。
非常感谢!
namespace phyl
{
public class DnaSequenceList : IEnumerable<DnaSequence>
{
// DNA sequences.
public DnaSequence[] mySequence;
// Mapping from site (index) to whether site is informative (true/false). If
// null, must be recomputed.
private bool[] isInformative;
// Number of informative sites.
private int nInformative;
// Number of state changes in uninformative sites.
private int nChanges;
/**
* Construct a new DNA sequence list.
*/
public DnaSequenceList()
{
}
/**
* Construct a new DNA sequence list that is a copy of the given DNA
* sequence list.
* <P>
* <I>Note:</I> The DNA sequences in the new list are copies of (not
* references to) the DNA sequences in the given list.
*
* @param list DNA sequence list to copy.
*
* @exception NullPointerException
* (unchecked exception) Thrown if <TT>list</TT> is null.
*/
public DnaSequenceList(DnaSequenceList list)
{
int N = list.mySequence.Length;
this.mySequence = new DnaSequence[N];
for (int i = 0; i < N; ++i)
{
this.mySequence[i] = new DnaSequence(list.mySequence[i]);
}
if (list.isInformative != null)
{
this.isInformative = list.isInformative;
}
this.nInformative = list.nInformative;
this.nChanges = list.nChanges;
}
/**
* Obtain this DNA sequence list's length.
*
* @return Length <I>N</I> (number of DNA sequences).
*/
public int length()
{
return mySequence.Length;
}
/**
* Get the DNA sequence at the given index in this DNA sequence list.
*
* @param i Index, 0 ≤ <TT>i</TT> ≤ <I>N</I>−1.
*
* @return DNA sequence.
*
* @exception ArrayIndexOutOfBoundsException
* (unchecked exception) Thrown if <TT>i</TT> is out of bounds.
*/
public DnaSequence seq(int i)
{
return mySequence[i];
}
public int exciseUninformativeSites()
{
int S = mySequence.Length;
int N = mySequence[0].length();
// Determine which sites are informative.
computeInformativeSites();
// Excise uninformative sites from sequences.
for (int s = 0; s < S; ++s)
{
byte[] oldSites = mySequence[s].mySites;
mySequence[s] = new DnaSequence (nInformative,mySequence[s].myScore,mySequence[s].myName);
byte[] excSites = mySequence[s].mySites;
int j = 0;
for (int i = 0; i < N; ++i)
{
if (isInformative[i])
{
excSites[j++] = oldSites[i];
}
}
}
// Mark all sites as informative.
isInformative = new bool[nInformative];
ArraysFill(isInformative, true);
// Return number of state changes.
return nChanges;
}
/**
* Returns the number of informative sites in this DNA sequence list.
*
* @return Number of informative sites.
*/
public int informativeSiteCount()
{
computeInformativeSites();
return nInformative;
}
/**
* Compute information about informative sites.
*/
private void computeInformativeSites()
{
if (isInformative != null) return;
int S = mySequence.Length;
int N = mySequence[0].length();
// Allocate storage to remember each site's category: true =
// informative, false = uninformative. Also count number of informative
// sites and number of state changes in uninformative sites.
isInformative = new bool[N];
nInformative = 0;
nChanges = 0;
// Allocate storage to count states at each site.
int[] stateCount = new int[16];
// Examine all sites.
for (int i = 0; i < N; ++i)
{
ArraysFill(stateCount, 0);
// Examine current site in all sequences.
for (int s = 0; s < S; ++s)
{
++stateCount[mySequence[s].mySites[i]];
}
// Count how many values in stateCount are 2 or greater.
int x = 0;
for (int j = 0; j < 16; ++j)
{
if (stateCount[j] >= 2) ++x;
}
// Categorize current site.
if (x >= 2)
{
// Informative site.
isInformative[i] = true;
++nInformative;
}
else
{
// Uninformative site. Increase number of state changes by
// (number of different states - 1).
isInformative[i] = false;
for (int j = 0; j < 16; ++j)
{
if (stateCount[j] > 0) ++nChanges;
}
--nChanges;
}
}
}
/**
* Determine the number of absent states after adding each sequence in this
* DNA sequence list to a tree. The return value <I>A</I> is an
* <I>N</I>-element array, where <I>N</I> is the length of this DNA sequence
* list. As sequences from this list are added to a tree in order from
* <I>i</I> = 0 to <I>N</I>−1, <I>A</I>[<I>i</I>] is the number of
* character states that do not yet appear in the tree. Thus, the number of
* state changes in the tree must increase by at least <I>A</I>[<I>i</I>]
* when the sequences after sequence <I>i</I> are added to the tree. This
* can be used to prune a branch-and-bound search.
*
* @return Array <I>A</I>.
*/
public int[] countAbsentStates()
{
int N = mySequence.Length;
int L = mySequence[0].length();
int[] A = new int[N];
// Compute the union of all the DNA sequences.
byte[] sites = new byte[L];
for (int i = 0; i < N; ++i)
{
byte[] mysites_i = mySequence[i].mySites;
for (int j = 0; j < L; ++j)
{
sites[j] |= mysites_i[j];
}
}
// Subtract each sequence from the union, count and record states.
for (int i = 0; i < N; ++i)
{
byte[] mysites_i = mySequence[i].mySites;
int count = 0;
for (int j = 0; j < L; ++j)
{
sites[j] &= mysites_i[j];
count += DnaSequence.state2bitCount[sites[j]];
}
A[i] = count;
}
return A;
}
/**
* Create a DNA sequence tree from this DNA sequence list and the given tree
* signature. The tree signature is an array of indexes of length <I>N</I>,
* where <I>N</I> is the length of this list. To construct the tree, for all
* <I>i</I> from 0 to <I>N</I>−1, the DNA sequence at index <I>i</I>
* in this list is added to the tree at index <TT>signature[i]</TT> using
* the <TT>DnaSequenceTree.add()</TT> method. For all <I>i</I>,
* <TT>signature[i]</TT> must be in the range 0 ..
* 2(<I>i</I> − 1), except <TT>signature[0]</TT> is 0.
* <P>
* <I>Note:</I> The returned tree has references to (not copies of) the DNA
* sequences in this list.
*
* @param signature Tree signature (array of tree indexes).
*
* @return Tree.
*/
public DnaSequenceTree toTree(int[] signature)
{
int N = mySequence.Length;
DnaSequenceTree tree = new DnaSequenceTree(2 * N - 1);
for (int i = 0; i < N; ++i)
{
tree.add(signature[i], mySequence[i]);
}
return tree;
}
public static void ArraysFill<T>(this T[] originalArray, T with)
{
for (int i = 0; i < originalArray.Length; i++)
{
originalArray[i] = with;
}
}
/// <summary>
/// //////////////////////////////////////////////////////////////
/// </summary>
/// <returns></returns>
// Implementation for the GetEnumerator method.
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)GetEnumerator();
}
public DnaSequenceEnum GetEnumerator()
{
return new DnaSequenceEnum(mySequence);
}
}
// When you implement IEnumerable, you must also implement IEnumerator.
public class DnaSequenceEnum : IEnumerator
{
public DnaSequence[] _DnaSequenceList;
// Enumerators are positioned before the first element
// until the first MoveNext() call.
int i = 0;
public DnaSequenceEnum(DnaSequence[] list)
{
_DnaSequenceList = list;
}
public bool MoveNext()
{
i++;
return i < _DnaSequenceList.Length;
}
public DnaSequence next()
{
return _DnaSequenceList[i++];
}
public void remove()
{
throw new NotSupportedException();
}
public DnaSequence Current
{
get
{
try
{
return _DnaSequenceList[i];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
object IEnumerator.Current { get { return Current; } }
public void Reset()
{
i = -1;
}
}
}
最佳答案
正是错误所说的 - 您在非静态类中有一个扩展方法。扩展方法必须在静态类中。将其移动到不同的静态类或使用常规方法制作(通过删除 this
)
由于您没有将该方法作为扩展调用,而是将其作为普通方法调用,因此我将删除 this
来自ArraysFill
的第一个参数
关于c# - 错误 : IEnumerable could Not be defined in non-generic static class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28469140/
generic parameters of trait function 的简单示例: trait Ext: Sized { fn then(self, f: fn(Self) -> R) -
在下面的代码中,为什么 Groovy 似乎忽略了方法 barMany 中提供的闭包参数的泛型类型声明: import groovy.transform.CompileStatic @CompileSt
据我所知,Prolog 没有任何内置机制用于generic programming。 .可以使用统一来模拟泛型,但这需要在运行时进行类型检查: :- initialization(main). :-
在我的应用程序中,我有一个 Board。董事会由细胞组成。每个单元格都有一个 int 值。有几种类型的 Board 可以扩展 Board。每种类型的板将以不同方式表示单元格。例如,一个人会使用 Lis
我想将存储的属性添加到 UIView 子类中,例如UIView、UIImageView、UIPickerView等, 我只需要从子类创建 UIView 的实例子类仅类型不同,所有属性和方法都相同。 T
这个问题在这里已经有了答案: Any type and implementing generic list in go programming language (2 个答案) 关闭 6 个月前。
我有以下代码as seen in ideone.com : import java.util.*; class Test{ interface Visitor{ public
在 Swift 中,我们可以对序列等通用项编写扩展: extension Sequence where Iterator.Element : ObservableType { } 这将保证扩展仅适用于
我知道这听起来很困惑,但这是我能解释的最好的了。 (您可以建议一个更好的标题)。我有 3 节课:- A public class A > { ... } B public class B {
我目前在大学攻读 CS,我刚刚开始学习数据结构和算法类(class)。我的教授非常喜欢(实际上是强制我们)使用 Ada。为了取得成功,我开始查找一些东西并找到了这段代码,它描述了如何编写通用堆栈: g
我正在玩 Scala By Example 开头的 QuickSort 示例并尝试将其调整为通用类型 A ,而不仅仅是 Int s。 到目前为止我的工作是 def sort[A new Y(i, -
谁能解释为什么下面的第二个例子不能编译? “测试 2”给出“错误 FS0670:此代码不够通用。类型变量 ^a 无法泛化,因为它会超出其范围。”。我无法理解此错误消息。 // Test 1 type
如何将泛型存储在非泛型对象持有的泛型TList中? type TXmlBuilder = class type TXmlAttribute= class Name: Str
我正在尝试通过遵循 wiki article 创建如何使用 GHC.Generics 的最小工作示例.这是我所拥有的: {-# LANGUAGE DefaultSignatures, DeriveGe
我正在尝试将 get 函数添加到 wiki 中描述的通用序列化中。 。有些部分看起来很简单,但有一些地方我非常不确定要写什么,毫不奇怪,我遇到了编译错误。我已经查看了原始论文以及 cereal 中的实
为什么这段代码有效? $v):void { print_r($v); } test(Vector {1, array("I'm an array"), 3}); 它不应该抛出错误吗?什么是应
有没有办法让 Rust Generic 只接受原始类型?我想稍后迭代值中的位,并且我知道这只有在原始类型中才有可能。 struct MyStruct { my_property: T // m
假设我有一个简单的类 public class MyObject { } 以及处理MyObject子类的handler接口(interface) public interface MyObjectHa
出于某种原因,我正在努力通过使用通用基类来实现通用接口(interface)的属性,如下所示: public interface IParent where TChild : IChild {
我收到以下错误。 google了一天多,还是找不到具体的解决方法,求大神指点,谢谢 ERROR: Cannot implicitly convert type System.Collections.G
我是一名优秀的程序员,十分优秀!