我正在尝试使用索引器来解决类中的数组属性。请根据以下代码示例告诉我如何处理。基于索引的属性应该能够在内部更新另一个属性。
遗产结构:
Record LegacyRec type basicRecord
3 TOTALPAID num(13,2) ;
3 TABLEOC2 char(85) ; // ONE OCCUR OF DATA - Below items are part of TABELOC2
4 DUEDATEX char(10) ;
4 ACCTX char(6) ;
4 TAXX num(9,2) ;
4 PENALTYX num(9,2) ;
4 INTERESTX num(9,2) ;
4 FEESX num(9,2) ;
4 TOTALPAIDX num(13,2) ;
4 SEQNUMX smallint ;
4 BILLNUMX char(8) ;
4 FILEDDATEX char(10) ;
3 TABLEKEY char(12) ; // TABLEKEY
4 TABLEID char(8) ;
4 TABLECODE char(4) ;
3 TABLEALL char(29750) ; // UP TO 400 OCCURS
4 TABLEOC1 char(85) [350] ; // INDEXED REDEFINE OF ABOVE
3 TABLESCREEN char(1275) ; // UP TO 15 OCCURS - It holds the data below array
4 TABLESCR char(61) [15] ; // INDEXED REDEFINE OF ABOVE
5 DUEDATES char(10) ;
5 ACCTS char(6) ;
5 TAXS num(9,2) ;
5 SEQNUMS smallint ;
5 CNT int ;
5 BILLNUMS char(10) ;
5 FILEDDATES char(20) ;
end
前端代码:(无法更改但我可以根据需要添加一些额外的函数调用)
decimal x;
string y;
LegacyRec XYZ1 = new LegacyRec();
XYZ1.TABLEOC2 = "ABCDEFGHIJXYZPQR 1234.78 67 4567.89 755553.55 56 63744.6 1RTY ZXCVBNMIOP";
x = XYZ1.PENALTYX;
y = XYZ1.DUEDATEX;
y = XYZ1.FILEDDATEX;
XYZ1.PENALTYX = 111.11M;
XYZ1.SEQNUMX = 34;
XYZ1.FILEDDATEX = "1234567890";
XYZ1.TABLEOC1[2]= "RRRR";
XYZ1.bdate = 10;
XYZ1.iitem[1] = 123;
XYZ1.il6[2] = "RTRRRTY";
for (int i = 1; i < XYZ1.TABLESCR.Count(); i++)
XYZ1.TABLESCR[i] = "";
XYZ1.TABLESCR[6] = "10/10/2010A5670056.89 231000AAA 20200202";
y = XYZ1.TAXS[6] ; //should show 56.89
.NET class //我目前的结构缺失索引器。我有使用Indexer设置数组属性数组的问题。
public class LegacyRec: basicRecord
{
public decimal TOTALPAID { get; set; }
public string TABLEOC2 { get; set; } //Main field
public string DUEDATEX {
get { return getPartialData(TABLEOC2, 1, 10).ToString(); }
set { TABLEOC2 = setPartialData(TABLEOC2, 1, 10, value).ToString(); } } //Sub Fields
public string ACCTX {
get { return getPartialData(TABLEOC2, 11, 6).ToString(); }
set { TABLEOC2 = setPartialData(TABLEOC2, 11, 6, value).ToString(); } } //Sub Fields
public decimal TAXX {
get { try { return decimal.Parse(getPartialData(TABLEOC2, 17, 9).ToString()); } catch { return 0; } }
set { TABLEOC2 = setPartialData(TABLEOC2, 11, 6, value).ToString(); } } //Sub Fields
public decimal PENALTYX {
get { try { return decimal.Parse(getPartialData(TABLEOC2, 26, 9).ToString()); } catch { return 0; } }
set { TABLEOC2 = setPartialData(TABLEOC2, 26, 9, value).ToString(); } } //Sub Fields
public decimal INTERESTX {
get { try { return decimal.Parse(getPartialData(TABLEOC2, 35, 9).ToString()); } catch { return 0; } }
set { TABLEOC2 = setPartialData(TABLEOC2, 35, 9, value).ToString(); } } //Sub Fields
public decimal FEESX {
get { try { return decimal.Parse(getPartialData(TABLEOC2, 44, 9).ToString()); } catch { return 0; } }
set { TABLEOC2 = setPartialData(TABLEOC2, 44, 9, value).ToString(); } } //Sub Fields
public decimal TOTALPAIDX {
get { try { return decimal.Parse(getPartialData(TABLEOC2, 53, 13).ToString()); } catch { return 0; } }
set { TABLEOC2 = setPartialData(TABLEOC2, 53, 13, value).ToString(); } } //Sub Fields
public int SEQNUMX {
get { try { return int.Parse(getPartialData(TABLEOC2, 66, 2).ToString()); } catch { return 0; } }
set { TABLEOC2 = setPartialData(TABLEOC2, 66, 2, value).ToString(); } } //Sub Fields
public string BILLNUMX {
get { return getPartialData(TABLEOC2, 68, 8).ToString(); }
set { TABLEOC2 = setPartialData(TABLEOC2, 68, 8, value).ToString(); } } //Sub Fields
public string FILEDDATEX {
get { return getPartialData(TABLEOC2, 76, 10).ToString(); }
set { TABLEOC2 = setPartialData(TABLEOC2, 76, 10, value).ToString(); } } //Sub Fields
public string TABLEALL { get; set; } // UP TO 400 OCCURS
private string[] _TABLEOC1;
public string this[int index] //not working
{
get { return _TABLEOC1[index]; }
set { _TABLEOC1[index] = value; TABLEALL = setPartialData(_TABLEOC1[index], index*10, 10, value).ToString(); //not working at this time}
}
public string[] TABLEOC1 {
get { return _TABLEOC1; }
set { TABLEALL = setPartialData(TABLEOC1[index], index*, 85, value).ToString(); } } // INDEXED REDEFINE OF ABOVE [350]
private string[] _TABLESCR;
public string[] TABLESCR { get { return _TABLESCR; } set { string s = "123"; } } //Main array with TableScreen
public string[] DUEDATES {
get from TABLESCR[index];
set TABLESCR particular Index; }
public string[] ACCTS {
get from TABLESCR[index];
set TABLESCR particular Index; }
public decimal[] TAXS {
get from TABLESCR[index];
set TABLESCR particular Index;}
public int[] SEQNUMS {
get from TABLESCR[index];
set TABLESCR particular Index;}
public int[] CNT {
get from TABLESCR[index];
set TABLESCR particular Index;}
public string[] BILLNUMS {
get from TABLESCR[index];
set TABLESCR particular Index;}
public string[] FILEDDATES {
get from TABLESCR[index];
set TABLESCR particular Index;}
}
答案 0 :(得分:1)
对你的问题的简短回答是你必须创建阵列才能做到这一点。
这很复杂,因为您尝试以C#不支持的方式进行数据叠加。例如,您有:
XYZ1.TABLEOC2 = "ABCDEFGHIJXYZPQR 1234.78 67 4567.89 755553.55 56 63744.6 1RTY ZXCVBNMIOP";
x = XYZ1.PENALTYX;
XYZ1.PENALTYX
是该字符串中的一个数字字段。你可以使它像TABLEOC2
这样的单个记录正常工作,但是当你进入数组时,它会变得相当困难。 C#只是没有在字符串顶部覆盖数字的概念。试图这样做需要您定义一个TABLESCR
类,该类可以从字符串中隐式分配,并且还具有ACCTS
,TAXS
等属性。然后您可以拥有一个数组那些TABLESCR
个实例和索引。
您的TABLESCR
课程类似于:
public class TABLESCR
{
private string _data;
public TABLESCR(string data)
{
_data = data;
}
public static implicit operator TABLESCR(string s)
{
return new TABLESCR(s);
}
public string DUEDATES
{
get { return ... }
set { // set the value in the _data string }
}
}
如果你想要一个结构或类,很难说。每个人都有缺点,但我建议上课。 basicRecord
的构造函数可能希望用一堆空的TABLESCR实例初始化数组。
在basicRecord
中,您有:
public TABLESCR[] TABLESCREEN = new TABLESCR[15];
TABLEALL非常简单,只是一个字符串数组:
public string[] TABLEALL = new string[350];
然后您可以参考TABLESCREEN[1]
和TABLEALL[1]
等
明白,这并不完全复制您拥有的内存布局,但它会复制功能。您可以使用自定义导入和导出逻辑将此转换为您正在使用的任何数据存储格式。
答案 1 :(得分:0)
记录VTDMW01-NEW类型basicRecord 3 TABLEALL char(29750); //最多400次 4 TABLEOC1 char(85)[350]; //上面的索引重新定义 3 TABLESCREEN char(1275); //最多400次 4 TABLESCR char(85)[15]; //上面的索引重新定义 5 DUEDATES char(10); 5 ACCTS char(6); 5税号(9,2); 5 PENALTYS num(9,2); 5利益num(9,2); 5 FEESS num(9,2); 5 TOTALPAIDS num(13,2); 5 SEQNUMS smallint; 5 BILLNUMS char(8); 5 FILEDDATES char(10); 3 TABLEOC2 char(85); //一次数据发生 4 DUEDATEX char(10); 4 ACCTX char(6); 4 TAXX num(9,2); 4 PENALTYX num(9,2); 4 INTERESTX num(9,2); 4 FEESX num(9,2); 4 TOTALPAIDX num(13,2); 4 SEQNUMX smallint; 4 BILLNUMX char(8); 4 FILEDDATEX char(10); 端
public class Vtdmw01New:basicRecord { public String tableall // UP TO 400 OCCURS { get {return getString(0,29750); } set {setString(0,29750,value); } } public StringArray tableoc1 //上面的INDXED REDEFINE { get {return getStringArray(0,85,350,85); } set {setStringArray(0,85,350,85,value); } } public String tablescreen //最多400次发现 { get {return getString(29750,1275); } set {setString(29750,1275,value); } } public StringArray tablescr // INDEXED REDEFINE OF ABOVE { get {return getStringArray(29750,85,15,85); } set {setStringArray(29750,85,15,85,value); } } public StringArray duedates { get {return getStringArray(29750,10,15,85); } set {setStringArray(29750,10,15,85,value); } } public StringArray accts { get {return getStringArray(29760,6,15,85); } set {setStringArray(29760,6,15,85,value); } } 公共DecimalArray税 { get {return getDecimalArray(29766,9,2,15,85); } set {setDecimalArray(29766,9,2,15,85,value); } } 公共DecimalArray惩罚 { get {return getDecimalArray(29775,9,2,15,85); } set {setDecimalArray(29775,9,2,15,85,value); } } public DecimalArray的利益 { get {return getDecimalArray(29784,9,2,15,85); } set {setDecimalArray(29784,9,2,15,85,value); } } public DecimalArray feess { get {return getDecimalArray(29793,9,2,15,85); } set {setDecimalArray(29793,9,2,15,85,value); } } public DecimalArray totalpaids { get {return getDecimalArray(29802,13,2,15,85); } set {setDecimalArray(29802,13,2,15,85,value); } } public BinaryArray seqnums { get {return getBinaryArray(29815,2,15,85); } set {setBinaryArray(29815,2,15,85,value); } } public StringArray billnums { get {return getStringArray(29817,8,15,85); } set {setStringArray(29817,8,15,85,value); } } 公共StringArray提交日期 { get {return getStringArray(29825,10,15,85); } set {setStringArray(29825,10,15,85,value); } } public String tableoc2 // ONE OCCUR OF DATA { get {return getString(31025,85); } set {setString(31025,85,value); } } public String duedatex { get {return getString(31025,10); } set {setString(31025,10,value); } } public String acctx { get {return getString(31035,6); } set {setString(31035,6,value); } } 公共十进制税 { get {return getDecimal(31041,9,2); } set {setDecimal(31041,9,2,value); } } 公共十进制惩罚 { get {return getDecimal(31050,9,2); } set {setDecimal(31050,9,2,value); } } 公共十进制利息 { get {return getDecimal(31059,9,2); } set {setDecimal(31059,9,2,value); } } 公共十进制费用 { get {return getDecimal(31068,9,2); } set {setDecimal(31068,9,2,value); } } public Decimal totalpaidx { get {return getDecimal(31077,13,2); } set {setDecimal(31077,13,2,value); } } public int seqnumx { get {return getBinary(31090,2); } set {setBinary(31090,2,value); } } public String billnumx { get {return getString(31092,8); } set {setString(31092,8,value); } } public String fileddatex { get {return getString(31100,10); } set {setString(31100,10,value); } } }
public StringArray getStringArray(int i)
{
return getStringArray(getOffSet(i, ColumnSize[i]), ColumnSize[i], ArrayLength, 0, i);
}
public class StringArray : AnyArray
{
public String this[int i]
{
get { return rec.getString(offset + disp * (i - 1), len); }
set { rec.setString(offset + disp * (i - 1), len, value); }
}
public StringArray(basicRecord rec, int offset, int len, int ArrayLen, int Disp = 0, int ColumnNo = 0)
: base(rec, offset, len, ArrayLen, Disp, ColumnNo)
{
//do nothing. Basclass constructor handles this
}
public bool Find(string compare)
{
for (int i = 1; i <= arrayLen + 1; i++)
{
if (this[i].Trim() == compare.Trim())
return true;
}
return false;
}
}
public class AnyArray
{
protected int offset;
protected int len;
protected int arrayLen;
protected int disp;
protected basicRecord rec;
public int columnNo;
public AnyArray()
{
}
public AnyArray(basicRecord rec, int offset, int len, int ArrayLen, int Disp = 0, int ColumnNo = 0)
{
this.rec = rec;
this.offset = offset;
this.len = len;
this.arrayLen = ArrayLen;
this.disp = (Disp == 0) ? len : Disp;
this.columnNo = ColumnNo;
}
}