繁体   English   中英

删除 c# 中字符串列表中的一个元素,给出错误(ArgumentOutOfRangeException)

[英]Removing an element in string list in c#, gives error(ArgumentOutOfRangeException)

我试图通过获取输入来过滤我的字符串列表,但出现此错误:ArgumentOutOfRangeException:索引超出范围。 必须为非负数且小于集合的大小。 参数名称:索引

private List<string> title = new List<string>();
private int cellNumber { get; set; }
private int counter = 0;

inputField.onValueChanged.AddListener(delegate { Search(cellNumber-counter); });

public void Search(int size)
{
    for (int i = 0; i < size; i++)
    {

        if (!title[i].ToLower().Contains(inputField.text.ToLower()) && inputField.text != "")
        {
            title.RemoveAt(i);
            counter++;
        }

    }
}

如果您点击了每个删除的项目,您的列表大小就会减少。

因此,即使假设您传递的列表size正确,迭代器变量i在最后某个时刻运行的时间也比删除项目后列表的新较小大小长 => ArgumentOutOfRangeException!


您可以做的是不断更新大小并在删除诸如 eg 之类的项目时跳过i++

public void Search()
{
    if (string.IsNullOrWhiteSpace(inputField.text))
    {
        return;
    }

    var size = title.Count;
    var i = 0;

    while(i < size)
    {
        if (!title[i].ToLower().Contains(inputField.text.ToLower()))
        {
            title.RemoveAt(i);
            size--;
        }
        else
        {
            i++;
        }
    }
}

请注意,有一个简单的方法已经涵盖了这一点,无需进一步努力: List<t>.RemoveAll

public void Search()
{
    if(string.IsNullOrWhiteSpace(inputField.text))
    {
        return;
    }

    // remove all matches
    title.RemoveAll(t => !t.ToLower().Contains(inputField.text.ToLower()));
}

尽管您可能对使用Linq Where更感兴趣,以便在不修改原始集合的情况下返回包含匹配项的新集合

using System.Linq;

...

public string[] Search()
{
    if(string.IsNullOrWhiteSpace(inputField.text))
    {
        return new string[0];
    }

    // remove all matches
    return title.Where(t => t.ToLower().Contains(inputField.text.ToLower())).ToArray();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM