-1

我正在尝试使用索引器来解决类中的数组属性。请让我知道如何根据以下代码示例进行处理。基于索引的属性应该能够在内部更新另一个属性。

遗留结构:

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 类 //我当前的结构缺少索引器。我在使用 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;}
}    
4

2 回答 2

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可从字符串隐式分配的类,并且还具有 、 等的属性ACCTSTAXS然后您可以拥有这些实例的数组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]andTABLEALL[1]等。

理解,这并不完全复制您拥有的内存布局,但它复制了功能。您可以使用自定义导入和导出逻辑将其转换为您正在使用的任何数据存储格式。

于 2013-08-30T14:28:48.120 回答
0

记录 VTDMW01-NEW 类型 basicRecord 3 TABLEALL char(29750) ; // 最多 400 次 4 TABLEOC1 char(85) [350] ; // 对 3 表屏幕以上的索引重新定义 char(1275) ; // 最多 400 次 4 TABLESCR char(85) [15] ; // 超过 5 个 DUEDATES 的索引重新定义 char(10) ; 5 ACCTS char(6) ; 5 税号(9,2);5 点球数(9,2);5 兴趣数(9,2);5 费斯数(9,2);5 TOTALPAIDS num(13,2) ; 5 SEQNUMS smallint ; 5 BILLNUMS char(8) ; 5 FILEDDATES char(10) ; 3 TABLEOC2 字符(85);// 一次数据出现 4 DUEDATEX char(10) ; 4 ACCTX 字符(6);4 税号 (9,2) ; 4 PENALTYX 数字(9,2);4 利息数(9,2);4 FEESX 数(9,2);4 TOTALPAIDX 数(13,2);4 SEQNUMX 小整数;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 // INDEXED REDEFINE OF ABOVE { get { return getStringArray(0, 85, 350, 85); } set { setStringArray(0, 85, 350, 85, value); } } public String tablescreen // UP TO 400 OCCURS { get { return getString(29750, 1275); } set { setString(29750, 1275, value); } } public StringArray tablescr // INDEXED REDEFIN 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); } } public 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 费用 { 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 归档日期 { 获取 { 返回 getStringArray(29825, 10, 15, 85); } set { setStringArray(29825, 10, 15, 85, value); } } public String tableoc2 // 一次出现数据 { 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); } } public Decimal taxx { get { return getDecimal(31041, 9, 2); } set { setDecimal(31041, 9, 2, value); } } 公共十进制惩罚 x { get { return getDecimal(31050, 9, 2); } set { setDecimal(31050, 9, 2, value); } } 公共十进制利息x { 得到 { 返回 getDecimal(31059, 9, 2); } set { setDecimal(31059, 9, 2, value); } } 公共十进制费用x { 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); } } 公共字符串归档日期 { 获取 { 返回 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;
        }
    }
于 2013-12-11T15:14:06.227 回答