Портирование Java Enumerator на C#
У меня Java-перечислитель сокращен до следующего из библиотеки BioJava:
public enum Element implements Serializable {
// most frequently used elements first
H(1, 1, 39, 1.10f, 0.32f, 1, 1, 1, 1, 1, 1.008f, 0, 1, 2.20f, ElementType.OTHER_NONMETAL),
C(6, 2, 0, 1.55f, 0.77f, 4, 4, 4, 4, 4, 12.011f, 2, -4, 2.55f, ElementType.OTHER_NONMETAL),
N(7, 2, 57, 1.40f, 0.75f, 5, 2, 5, 3, 4, 14.007f, 2, -3, 3.04f, ElementType.OTHER_NONMETAL),
O(8, 2, 65, 1.35f, 0.73f, 6, 1, 2, 2, 2, 16.000f, 2, -2, 3.44f, ElementType.OTHER_NONMETAL),
.....
private int atomicNumber;
private int period;
private float VDWRadius; // in Angstroms
private float covalentRadius; // in Angstroms
private int valenceElectronCount;
private int minimumValence;
private int maximumValence;
private int commonValence;
private int maximumCovalentValence;
private float atomicMass;
private int coreElectronCount;
private int oxidationState;
private float paulingElectronegativity;
private ElementType elementType;
private static final Map<String,Element> allElements ;
static {
allElements = new HashMap<String,Element>();
for (Element e : Element.values()){
allElements.put(e.toString().toLowerCase(), e);
}
}
private Element(int atomicNumber,
int period,
int hillOrder,
float VDWRadius,
float covalentRadius,
int valenceElectronCount,
int minimumValence,
int maximumValence,
int commonValence,
int maximumCovalentValence,
float atomicMass,
int coreElectronCount,
int oxidationState,
float paulingElectronegativity,
ElementType elementType) {
this.atomicNumber = atomicNumber;
this.period = period;
//this.hillOrder = hillOrder;
this.VDWRadius = VDWRadius;
this.covalentRadius = covalentRadius;
this.valenceElectronCount = valenceElectronCount;
this.minimumValence = minimumValence;
this.maximumValence = maximumValence;
this.commonValence = commonValence;
this.maximumCovalentValence = maximumCovalentValence;
this.atomicMass = atomicMass;
this.coreElectronCount = coreElectronCount;
this.oxidationState = oxidationState;
this.paulingElectronegativity = paulingElectronegativity;
this.elementType = elementType;
}
Я хотел бы просто перенести эту структуру на C#, где есть перечисление элементов с основной информацией о прикрепленном элементе. Как бы я это сделал?
Предпочтительно, чтобы решение было эффективным с точки зрения памяти.
1 ответ
Решение
Перечисления в CLR просто называются константами. Базовый тип должен быть целочисленным. В Java перечисление больше похоже на именованный экземпляр типа. Этот тип может быть довольно сложным и - как показывает ваш пример - содержать несколько полей разных типов.
Чтобы перенести пример на C#, я бы просто изменил перечисление на неизменяемый класс и выставил статические только для чтения экземпляры этого класса:
public class Element {
// most frequently used elements first
public static readonly Element H = new Element(1, 1, 39, 1.10f, 0.32f, 1, 1, 1, 1, 1, 1.008f, 0, 1, 2.20f, ElementType.OTHER_NONMETAL);
public static readonly Element C = new Element(6, 2, 0, 1.55f, 0.77f, 4, 4, 4, 4, 4, 12.011f, 2, -4, 2.55f, ElementType.OTHER_NONMETAL);
public static readonly Element N = new Element(7, 2, 57, 1.40f, 0.75f, 5, 2, 5, 3, 4, 14.007f, 2, -3, 3.04f, ElementType.OTHER_NONMETAL);
public static readonly Element O = new Element(8, 2, 65, 1.35f, 0.73f, 6, 1, 2, 2, 2, 16.000f, 2, -2, 3.44f, ElementType.OTHER_NONMETAL);
private int atomicNumber;
private int period;
private float VDWRadius; // in Angstroms
private float covalentRadius; // in Angstroms
private int valenceElectronCount;
private int minimumValence;
private int maximumValence;
private int commonValence;
private int maximumCovalentValence;
private float atomicMass;
private int coreElectronCount;
private int oxidationState;
private float paulingElectronegativity;
private ElementType elementType;
private static readonly IDictionary<String,Element> allElements ;
static Element(){
allElements = new Dictionary<String,Element>();
allElements.Add("h", H);
allElements.Add("c", C);
allElements.Add("n", N);
allElements.Add("o", O);
}
private Element(int atomicNumber,
int period,
int hillOrder,
float VDWRadius,
float covalentRadius,
int valenceElectronCount,
int minimumValence,
int maximumValence,
int commonValence,
int maximumCovalentValence,
float atomicMass,
int coreElectronCount,
int oxidationState,
float paulingElectronegativity,
ElementType elementType) {
this.atomicNumber = atomicNumber;
this.period = period;
//this.hillOrder = hillOrder;
this.VDWRadius = VDWRadius;
this.covalentRadius = covalentRadius;
this.valenceElectronCount = valenceElectronCount;
this.minimumValence = minimumValence;
this.maximumValence = maximumValence;
this.commonValence = commonValence;
this.maximumCovalentValence = maximumCovalentValence;
this.atomicMass = atomicMass;
this.coreElectronCount = coreElectronCount;
this.oxidationState = oxidationState;
this.paulingElectronegativity = paulingElectronegativity;
this.elementType = elementType;
}
}