我正在编写一个窗口表单来计算项目编号的UPC。
我成功地创建了一个可以一次处理一个项目号/UPC的程序,现在我想对多个项目号/UPC进行扩展和处理。
我已经开始尝试使用一个列表,但我一直被困住了。我创建了一个帮助类:
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,去掉校验位数,然后把这个数字增加一个,然后把它放到列表中。然后我计算新数字的校验位数,并把它放在列表中。在这里我已经得到了一个内存不足的异常。下面是我到目前为止掌握的代码:
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, "", ""));
}这是正确的方式去做它,使用一个列表,还是我应该看到一个不同的方式?
发布于 2013-12-20 07:12:58
虽然KChaloux答案很棒,但我想指出另一个考虑:List<T>比数组强大得多。List<T>的方法在很多情况下都非常有用--数组没有这些方法,您可能会花费大量时间来实现解决方案。
因此,从开发的角度来看,我几乎总是使用List<T>,因为当有额外的需求时,当您使用List<T>时,它们通常更容易实现。
这导致了最后一个问题:我的代码(我不知道您的代码)包含90%的List<T>,所以数组并不适合。当我传递它们时,我必须调用它们的.toList()方法并将它们转换成一个列表--这很烦人,而且速度太慢,以至于使用数组所带来的任何性能增益都会丢失。
发布于 2016-09-05 19:23:00
但是没有人提到这一部分:“这里我已经得到了一个内存异常。”这完全是由于
for (int i = 0; i < ItemNumberList.Count; i++)
{
ItemNumberList.Add(new item());
}很清楚为什么。我不知道您是打算添加到不同的列表中,还是应该在循环之前将ItemNumberList.Count作为变量存储,以获得所需的结果,但这是完全失败的。
Programmers.SE的意思是“软件开发的概念性问题中的...interested.”,而其他的答案则是这样处理的。试着用http://codereview.stackexchange.com代替,这个问题适合的地方。但是即使在那里,也是很可怕的,因为我们只能假设这段代码是从_Click开始的,它没有调用multiValue1,您说在那里会发生错误。
https://softwareengineering.stackexchange.com/questions/221892
复制相似问题