当我需要索引位置周围的项目时,如何防止"index out of range"?



我有一个字符串数组,它表示文本文件的行。现在我想搜索出现给定参数的行,并返回此行加上四个相邻的行。 当我搜索的字符串在最后或前两个索引中找到时,会出现此问题。显然,这是因为当没有索引时,我想要索引[i+2]。 理想情况下,如果最后一行是素数,它应该只返回 this 和它前面的两行,因为它后面没有两行。

那么,除了在"包含"-if-语句中的五行中的每一行前面添加一个 if 语句之外,是否有最佳实践如何解决此问题?

ReadAsString将文本文件的内容转换为字符串数组_textAsString

public string[] GetNearestInstructions(string foo)
{
try
{
string[] stringsToReturn = new string[5];
if (!this.ReadAsString())
return null;
else if (foo == null)
return null;
else
{
for (int i = 0; i < _textAsString.Length; i++)
{
if (_textAsString[i].Contains(foo))
{
stringsToReturn[0] = _textAsString[i - 2];
stringsToReturn[1] = _textAsString[i - 1];
stringsToReturn[2] = _textAsString[i];
stringsToReturn[3] = _textAsString[i + 1];
stringsToReturn[4] = _textAsString[i + 2];
}
}
if (stringsToReturn != null)
return stringsToReturn;
else
return null;
}
}
catch (Exception)
{
throw;
}
}

你可以做类似的事情

...
if (_textAsString[i].Contains(foo))
{
int rangoLow = Math.Max(i - 2, 0);
int rangeHigh = Math.Min(i + 2, _textAsString.Length - 1);
for (int i = rangeLow; i <= rangeHigh; i++)
{
stringsToReturn[i - rangeLow] = _textAsString[i];
}

假设您需要以与现在返回完全相同的格式array结果,即在开头或结尾使用 null 项目,这就是我会这样做的方式:

public static string[] GetNearestInstructions(string foo)
{
if (foo != null && this.ReadAsString())
{
int index = Array.IndexOf(_textAsString, foo);
if (index >= 0)
{
string[] stringsToReturn = new string[5];
stringsToReturn[0] = index > 1 ? _textAsString[index - 2] : null;
stringsToReturn[1] = index > 0 ? _textAsString[index - 1] : null;
stringsToReturn[2] = _textAsString[index];
stringsToReturn[3] = index < _textAsString.Length - 1 ? _textAsString[index + 1] : null;
stringsToReturn[4] = index < _textAsString.Length - 2 ? _textAsString[index + 2] : null;
return stringsToReturn;
}
}
return null;
}

如果您可以更改返回的项目数量,事情会变得更容易,请参阅其他答案。

您需要根据需要调整第一个 + 最后一个索引。请参阅下面的代码。此外,我stringsToReturn更改为List,因为它更方便,并且如果少于 5 个项目,则始终返回 5 个项目的数组是没有意义的。

List<string> stringsToReturn = new List<string>();
for (int i = 0; i < _textAsString.Length; i++)
{
if (_textAsString[i].Contains(foo))
{
var firstIndex = Math.Max(0, i - 2);
var lastIndex = Math.Min(_textAsString.Length - 1, i + 2);
for (int j = firstIndex; j <= lastIndex; j++)
stringsToReturn.Add(_textAsString[j]);
return stringsToReturn.ToArray();
}
}
// foo not found
return null;

请注意,如果_textAsString是字符串(不是字符串的集合(,那么此函数应将 char 作为参数,并返回字符(或单个字符串(的集合。

最新更新