首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用列表还是数组?

我应该使用列表还是数组?
EN

Software Engineering用户
提问于 2013-12-19 15:45:15
回答 2查看 84.3K关注 0票数 22

我正在编写一个窗口表单来计算项目编号的UPC。

我成功地创建了一个可以一次处理一个项目号/UPC的程序,现在我想对多个项目号/UPC进行扩展和处理。

我已经开始尝试使用一个列表,但我一直被困住了。我创建了一个帮助类:

代码语言:javascript
复制
public class Codes
{
    private string incrementedNumber;
    private string checkDigit;
    private string wholeNumber;
    private string wholeCodeNumber;
    private string itemNumber;

    public Codes(string itemNumber, string incrementedNumber, string checkDigit, string wholeNumber, string wholeCodeNumber)
    {
        this.incrementedNumber = incrementedNumber;
        this.checkDigit = checkDigit;
        this.wholeNumber = wholeNumber;
        this.wholeCodeNumber = wholeCodeNumber;
        this.itemNumber = itemNumber;
    }

    public string ItemNumber
    {
        get { return itemNumber; }
        set { itemNumber = value; }
    }

    public string IncrementedNumber
    { 
        get { return incrementedNumber; }
        set { incrementedNumber = value; } 
    }

    public string CheckDigit
    {
        get { return checkDigit; }
        set { checkDigit = value; }
    }

    public string WholeNumber
    {
        get { return wholeNumber; }
        set { wholeNumber = value; }
    }

    public string WholeCodeNumber
    {
        get { return wholeCodeNumber; }
        set { wholeCodeNumber = value; }
    }

}

然后我开始了我的代码,但问题是这个过程是增量的,这意味着我通过复选框从网格视图中获取项目号,并将它们放在列表中。然后我从数据库中得到最后一个UPC,去掉校验位数,然后把这个数字增加一个,然后把它放到列表中。然后我计算新数字的校验位数,并把它放在列表中。在这里我已经得到了一个内存不足的异常。下面是我到目前为止掌握的代码:

代码语言:javascript
复制
List<Codes> ItemNumberList = new List<Codes>();


    private void buttonSearch2_Click(object sender, EventArgs e)
    {
        //Fill the datasets
        this.immasterTableAdapter.FillByWildcard(this.alereDataSet.immaster, (textBox5.Text));
        this.upccodeTableAdapter.FillByWildcard(this.hangtagDataSet.upccode, (textBox5.Text));
        this.uPCTableAdapter.Fill(this.uPCDataSet.UPC);
        string searchFor = textBox5.Text;
        int results = 0;
        DataRow[] returnedRows;
        returnedRows = uPCDataSet.Tables["UPC"].Select("ItemNumber = '" + searchFor + "2'");
        results = returnedRows.Length;
        if (results > 0)
        {
            MessageBox.Show("This item number already exists!");
            textBox5.Clear();
            //clearGrids();
        }
        else
        {
            //textBox4.Text = dataGridView1.Rows[0].Cells[1].Value.ToString();
            MessageBox.Show("Item number is unique.");
        }
    }

    public void checkMarks()
    {

        for (int i = 0; i < dataGridView7.Rows.Count; i++)
        {
            if ((bool)dataGridView7.Rows[i].Cells[3].FormattedValue)
            {
                {
                    ItemNumberList.Add(new Codes(dataGridView7.Rows[i].Cells[0].Value.ToString(), "", "", "", ""));
                }
            }
        }
    }

    public void multiValue1()
    {
        _value = uPCDataSet.UPC.Rows[uPCDataSet.UPC.Rows.Count - 1]["UPCNumber"].ToString();//get last UPC from database
        _UPCNumber = _value.Substring(0, 11);//strip out the check-digit
        _UPCNumberInc = Convert.ToInt64(_UPCNumber);//convert the value to a number

        for (int i = 0; i < ItemNumberList.Count; i++)
        {
            _UPCNumberInc = _UPCNumberInc + 1;
            _UPCNumberIncrement = Convert.ToString(_UPCNumberInc);//assign the incremented value to a new variable
            ItemNumberList.Add(new Codes("", _UPCNumberIncrement, "", "", ""));//**here I get the OutOfMemoreyException**
        }

        for (int i = 0; i < ItemNumberList.Count; i++)
        {
            long chkDigitOdd;
            long chkDigitEven;
            long chkDigitSubtotal;
            chkDigitOdd = Convert.ToInt64(_UPCNumberIncrement.Substring(0, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(2, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(4, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(6, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(8, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(10, 1));
            chkDigitOdd = (3 * chkDigitOdd);
            chkDigitEven = Convert.ToInt64(_UPCNumberIncrement.Substring(1, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(3, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(5, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(7, 1)) + Convert.ToInt64(_UPCNumberIncrement.Substring(9, 1));
            chkDigitSubtotal = (300 - (chkDigitEven + chkDigitOdd));
            _chkDigit = chkDigitSubtotal.ToString();
            _chkDigit = _chkDigit.Substring(_chkDigit.Length - 1, 1);
            ItemNumberList.Add(new Codes("", "",_chkDigit, "", ""));
        }

这是正确的方式去做它,使用一个列表,还是我应该看到一个不同的方式?

EN

回答 2

Software Engineering用户

发布于 2013-12-20 07:12:58

虽然KChaloux答案很棒,但我想指出另一个考虑:List<T>比数组强大得多。List<T>的方法在很多情况下都非常有用--数组没有这些方法,您可能会花费大量时间来实现解决方案。

因此,从开发的角度来看,我几乎总是使用List<T>,因为当有额外的需求时,当您使用List<T>时,它们通常更容易实现。

这导致了最后一个问题:我的代码(我不知道您的代码)包含90%的List<T>,所以数组并不适合。当我传递它们时,我必须调用它们的.toList()方法并将它们转换成一个列表--这很烦人,而且速度太慢,以至于使用数组所带来的任何性能增益都会丢失。

票数 6
EN

Software Engineering用户

发布于 2016-09-05 19:23:00

但是没有人提到这一部分:“这里我已经得到了一个内存异常。”这完全是由于

代码语言:javascript
复制
for (int i = 0; i < ItemNumberList.Count; i++)
{
    ItemNumberList.Add(new item());
}

很清楚为什么。我不知道您是打算添加到不同的列表中,还是应该在循环之前将ItemNumberList.Count作为变量存储,以获得所需的结果,但这是完全失败的。

Programmers.SE的意思是“软件开发的概念性问题中的...interested.”,而其他的答案则是这样处理的。试着用http://codereview.stackexchange.com代替,这个问题适合的地方。但是即使在那里,也是很可怕的,因为我们只能假设这段代码是从_Click开始的,它没有调用multiValue1,您说在那里会发生错误。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/221892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档