Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图从数组中删除单个值_C# - Fatal编程技术网

C# 试图从数组中删除单个值

C# 试图从数组中删除单个值,c#,C#,我试图从所选索引处传递的数组中删除一个值。基本上,获取显示数组的列表框的选定索引,并使用它删除条目。由于某些原因,在我运行程序时,没有任何内容被删除并保持不变。我正在Visual Studio 2010中用C语言编程# public double[]重绘数组(double[]位,int-selectedIndex) { double[]redoneArray=新的double[ary.GetUpperBound(0)]; for(int i=selectedIndex;i

我试图从所选索引处传递的数组中删除一个值。基本上,获取显示数组的列表框的选定索引,并使用它删除条目。由于某些原因,在我运行程序时,没有任何内容被删除并保持不变。我正在Visual Studio 2010中用C语言编程#

public double[]重绘数组(double[]位,int-selectedIndex)
{
double[]redoneArray=新的double[ary.GetUpperBound(0)];
for(int i=selectedIndex;i
下面是代码的删除按钮部分

private void btnDelete_Click(object sender, EventArgs e)
{
    int selectedIndex;
    if (this.lstClients.SelectedIndex <= 1)
    {
        return;
    }

    //else if ((this.lstClients.SelectedIndex - 2) < arrayIndex)
    else
    {
            selectedIndex = this.lstClients.SelectedIndex - 2;
            this.lstClients.Items.RemoveAt(this.lstClients.SelectedIndex);
            lbSI.Text = (this.lstClients.SelectedIndex - 2).ToString();
            redrawArray(mFirstNameArray, selectedIndex);
            redrawArray(mLastNameArray, selectedIndex);
            redrawArray(mAgeArray, selectedIndex);
            redrawArray(mHeightArray, selectedIndex);
            redrawArray(mStartWeightArray, selectedIndex);
            redrawArray(mGoalWeightArray , selectedIndex);
            redrawArray(mTotalWeeksArray, selectedIndex);
            //arrayIndex += -1;                    
            lstClients.Items.Clear();
            loadListBox();
    }

}
private void btnDelete\u单击(对象发送者,事件参数e)
{
int-selectedIndex;

如果(this.lstClients.SelectedIndex您是从
SelectedIndex
开始的。但是新数组不包含任何源数组。这使索引
0
之前的所有内容都变为空。这可以通过
array.Copy
解决

public static double[] redrawArray(double[] ary, int selectedIndex) {
    double[] redoneArray = new double[ary.GetUpperBound(0)];

    Array.Copy(ary, redoneArray, ary.GetUpperBound(0)); // copy the source into the destination minus one..

    for (int i = selectedIndex; i < ary.GetUpperBound(0); i++) {
        redoneArray[i] = ary[i + 1];
    }

    return redoneArray;
}

您是从
所选的索引开始的。但是新数组不包含任何源数组。这会使索引
0
之前的所有内容都变为0。这可以通过
数组。复制
来解决

public static double[] redrawArray(double[] ary, int selectedIndex) {
    double[] redoneArray = new double[ary.GetUpperBound(0)];

    Array.Copy(ary, redoneArray, ary.GetUpperBound(0)); // copy the source into the destination minus one..

    for (int i = selectedIndex; i < ary.GetUpperBound(0); i++) {
        redoneArray[i] = ary[i + 1];
    }

    return redoneArray;
}

如果您想要一个可以从中删除内容的数组,那么最好使用类似于
List
的内容,这将为您节省很多麻烦

然后要在特定索引处删除,只需调用
.RemoveAt(index)


如果您仍然希望在外部使用数组,可以通过使用
array.ToList()
函数来“欺骗”您自己获得一个列表,删除您想要的任何内容,然后
.toArray()
返回。是的,效率很低,但我不认为你目前做的事情有那么快。

如果你想要一个可以删除内容的数组,那么最好使用类似于
列表的东西,这将为你节省很多麻烦

然后要在特定索引处删除,只需调用
.RemoveAt(index)


如果您仍然希望在外部使用数组,可以通过使用
array.ToList()
函数来“欺骗”您自己获得一个列表,删除您想要的任何内容,然后
.toArray()
返回。是的,效率很低,但我不认为您当前的操作速度有这么快。

我强烈建议使用
列表,因为它有一个更优雅、更高效的添加和删除项目的策略

你的算法有一个很大的问题,因为你实际上没有使用
selectedIndex
来过滤掉“已删除”项。我认为它应该是这样的

public double[] redrawArray(double[] ary, int selectedIndex)
{
    double[] redoneArray = new double[ary.GetUpperBound(0)];
    int i = 0;
    for (; i < selectedIndex; i++)
    {
        redoneArray[i] = ary[i];
    }
    for (; i < redoneArray.Length; i++)
    {
        redoneArray[i] = ary[i + 1];
    }
    return redoneArray;
}

更新

然而,真正的问题是,您正在
重画数组
方法返回一个新数组,而不是修改现有数组。您必须使用将结果数组赋回变量,如下所示:

mFirstNameArray = redrawArray(mFirstNameArray, selectedIndex);
mLastNameArray = redrawArray(mLastNameArray, selectedIndex);
mAgeArray = redrawArray(mAgeArray, selectedIndex);
mHeightArray = redrawArray(mHeightArray, selectedIndex);
mStartWeightArray = redrawArray(mStartWeightArray, selectedIndex);
mGoalWeightArray = redrawArray(mGoalWeightArray , selectedIndex);
mTotalWeeksArray = redrawArray(mTotalWeeksArray, selectedIndex);

我强烈建议使用
列表
,因为它有一个更优雅、更有效的添加和删除项目的策略

你的算法有一个很大的问题,因为你实际上没有使用
selectedIndex
来过滤掉“已删除”项。我认为它应该是这样的

public double[] redrawArray(double[] ary, int selectedIndex)
{
    double[] redoneArray = new double[ary.GetUpperBound(0)];
    int i = 0;
    for (; i < selectedIndex; i++)
    {
        redoneArray[i] = ary[i];
    }
    for (; i < redoneArray.Length; i++)
    {
        redoneArray[i] = ary[i + 1];
    }
    return redoneArray;
}

更新

然而,真正的问题是,您正在
重画数组
方法返回一个新数组,而不是修改现有数组。您必须使用将结果数组赋回变量,如下所示:

mFirstNameArray = redrawArray(mFirstNameArray, selectedIndex);
mLastNameArray = redrawArray(mLastNameArray, selectedIndex);
mAgeArray = redrawArray(mAgeArray, selectedIndex);
mHeightArray = redrawArray(mHeightArray, selectedIndex);
mStartWeightArray = redrawArray(mStartWeightArray, selectedIndex);
mGoalWeightArray = redrawArray(mGoalWeightArray , selectedIndex);
mTotalWeeksArray = redrawArray(mTotalWeeksArray, selectedIndex);
public double[]重绘数组(double[]位,int-selectedIndex)
{  
var lst=新列表(ary);
一级移除(选择索引);
返回lst.ToArray();
}
公共双[]重绘数组(双[]位,int-selectedIndex)
{  
var lst=新列表(ary);
一级移除(选择索引);
返回lst.ToArray();
}

有了Linq,我想你可以:

public double[] RedrawArray(double[] ary, int selectedIndex)
{
  return ary.Where((d, i) => i!=selectedIndex).ToArray();
}
或:

取决于调用方法时最方便的语法


请注意,在任何一种情况下,传递给此方法的数组在方法运行时都不应由其他线程修改。在
ref
情况下,如果传递了字段或捕获的变量,则该变量不得由其他线程重新分配。

使用Linq,我想您可以:

public double[] RedrawArray(double[] ary, int selectedIndex)
{
  return ary.Where((d, i) => i!=selectedIndex).ToArray();
}
或:

取决于调用方法时最方便的语法


请注意,在任何一种情况下,传递给此方法的数组都不应在方法运行时被其他线程修改。在
ref
情况下,如果传递了字段或捕获的变量,则该变量不得由其他线程重新分配。

您如何调用此函数?此外,您是否有任何理由在通用列表?正如@Oded所说,使用
列表
可能会更好。此外,我认为如果您向我们展示如何将数组的内容添加到
列表框
中会有所帮助,因为这可能也是一个数据绑定问题。我之所以使用数组,是因为它是一个类赋值并调用它。我尝试使用列表框,但我们无法使用它nt在这一点上超出了我的理解。你是如何调用这个函数的?另外,你使用数组而不是泛型列表的原因是什么?正如@Oded所说,使用
列表
可能会更好。此外,我认为如果你向我们展示你是如何将数组的内容添加到
列表框
中的,这会有所帮助,因为它也可能是一个数据b绑定问题。我使用数组是因为它是一个类赋值并调用它。我尝试使用一个列表框,但在这一点上它超出了我的头脑。Ohhh+1,我更喜欢你的第二个解决方案。我一直在尝试,但我得到了相同的结果,数组没有改变。我不确定为什么。@Wilken问题出在其他地方。你会发现的需要发布更多你的代码。这是有道理的。我没有足够的声誉来击败你。但是你是我的英雄!@Wilken如果这个(或任何其他)答案解决了你的问题
public double[] RedrawArray(double[] ary, int selectedIndex)
{
  return ary.Where((d, i) => i!=selectedIndex).ToArray();
}
public void RedrawArray(ref double[] ary, int selectedIndex)
{
  ary = ary.Where((d, i) => i!=selectedIndex).ToArray();
}