我试图在C#中向数组添加项目。我不能采用诸如使用列表之类的快捷方式。
我明白为了做到这一点,我必须创建一个新数组。这是我已经拥有的代码。
public void addAtLocation(int location, String element)
{
String[] newMyArray = new string[myArray.Length + 1];
for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length + 1; oldIndex++, newIndex++)
{
if (newIndex == location)
{
newMyArray[oldIndex] = element;
oldIndex--;
}
else
{
newMyArray[newIndex] = myArray[oldIndex];
}
}
myArray = newMyArray;
}
我不是只想修复我的代码解决方案。我需要理解为什么会这样。
答案 0 :(得分:0)
在for循环中,条件必须是oldIndex <= myArray.Length - 1
或oldIndex < myArray.Length
,而非oldIndex < myArray.Length + 1
。
public void addAtLocation(int location, String element)
{
String[] newMyArray = new string[myArray.Length + 1];
for (int oldIndex = 0, newIndex = 0; oldIndex <= myArray.Length - 1; oldIndex++, newIndex++)
{
if (newIndex == location)
{
newMyArray[oldIndex] = element;
oldIndex--;
}
else
{
newMyArray[newIndex] = myArray[oldIndex];
}
}
myArray = newMyArray;
}
答案 1 :(得分:0)
你的麻烦源于它难以阅读。尝试不同的方法。
public void addAtLocation(int location, String element)
{
String[] newMyArray = new string[myArray.Length + 1];
int addedUnit = 0;//sort of like a flag to indicate the element has been inserted
for (int i = 0; i < myArray.Length; i++)
{
if (i == location)
{
newMyArray[i] = element;
newMyArray[i+1] = myArray[i]; //add two elements
addedUnit = 1;
}
else
{
newMyArray[i+addedUnit] = myArray[i];
}
}
myArray = newMyArray;
}
答案 2 :(得分:0)
所以主要的问题是for循环的条件。您正在尝试减少循环中的<script src="//app-sj05.marketo.com/js/forms2/js/forms2.min.js"></script>
<form id="mktoForm_ourFormID"></form>
<script>
MktoForms2.loadForm("//app-sj05.marketo.com", "ourID", ourFormID, function(form) {
// Set values in hidden field to determine asset to serve
form.vals({
"Campaign_Asset__c":"assignedCampaignAsset"
});
// Check to see if referring url set campaign ID, if not set value in hidden field
if( !form.getValues()['Campaign_Id__c'] ) {
form.setValues({
"Campaign_Id__c":"assignedCampaignID"
})
}
// Override redirect URL set in Marketo
form.onSuccess(function(values, followUpUrl) {
location.href = "redirectURL";
// Return false to prevent the submission handler continuing with its own processing
return false;
});
});
</script>
以跟踪已复制的项目,但由于它是您的循环变量,因此当oldIndex
增加时,您实际上最终会超过新数组的末尾每一次。
将newIndex
更改为条件中的循环变量:
newIndex
请注意,这比将条件更改为for (int oldIndex = 0, newIndex = 0; newIndex < myArray.Length + 1; oldIndex++, newIndex++)
更有效,因为它会错过在最后位置添加新项目。
请注意,即使您无法使用oldIndex < myArray.Length
,这实际上也过于复杂,因为有内置的复制数组的方法。例如:
List<string>
答案 3 :(得分:-2)
您的代码:
for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length + 1; oldIndex++, newIndex++)
将抛出索引超出范围的异常。为什么?好吧,只需仔细阅读代码即可。基本上,你需要假装你是Visual Studio调试器,并逐步完成代码(相信我,我们都这样做)。当您走过代码时,我想您很快就会意识到这是您真正需要做的事情:
for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length; oldIndex++, newIndex++)
原因是,您打算走旧数组(比新数组少1个数组),并将值复制到新数组。但是实际的代码试图在旧的数组中使用 new 数组中的元素数量加上一个...是的 - 你有相反的运算符。十分简单!