String[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
String line = "four95qvkvveight5";
index_digit2 = digits
.Where(d => line.Contains(d))
.Max(d => line.IndexOf(d));
Я перебираю файл в поисках первой и последней цифры в каждой строке. Это то, что я использую для поиска последнего целого числа в каждой строке, и это работает нормально, пока я не доберусь до строки, которую вы видите выше. Потому что я получаю индекс первых 5, а не последних. (index_digit2 = 5, а не 16, как я ожидал)
Я не понимаю, почему это так и есть ли быстрое решение.
Во всех остальных случаях, насколько я мог проверить, это работает довольно хорошо.
IndexOf
=> "Сообщает отсчитываемый от нуля индекс первого вхождения указанного символа Юникода в этой строке.", LastIndexOf
=> "Сообщает отсчитываемый от нуля индекс последнего вхождения ..." и на самом деле также есть LastIndexOfAny
, что избавляет вас от пунктаwhere.
Ради этого вопроса, считаете ли вы 95 не одним целым числом, а двумя целыми числами (9 и 5)?
^^ Да, это противоречиво. Вы говорите как о «поиске первой и последней цифры в каждой строке», так и прямо в следующем предложении «искать последнее целое число в каждой строке» - что на самом деле является другой задачей.
Хорошо, я ищу однозначные цифры, а не целые числа. И я думаю, что LastIndexOfAny() — очень быстрое решение^^
Как я сказал во втором комментарии: рассмотрим LastIndexOfAny
— это сведется к line.LastIndexOfAny(digits);
.
... и познакомьтесь с BenchmarkDotnet. Вы захотите внести в это несколько итераций измеримых улучшений.
Вы также можете рассмотреть вариант char.IsDigit.
Я бы просто перебрал символы в вашей строке от начала до конца:
int? index = null;
for(int i = myString.Length - 1; i >= 0; i--)
{
if (myString[i].IsDigit())
{
index = i;
break;
}
}
или немного короче:
var result = myString.Select((x, i) => new { Index = i, Char = x }).LastOrDefault(x => x.Char.IsDigit())?.Index;
или используя string.LastIndexOfAny:
var result = myString.LastIndexOfAny(digits);
Это должно сработать. Он нашел пятую позицию и возвращает 5.
String[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
String line = "four95qvkvveight5";
var index_digit2 = digits
.Where(d => line.Contains(d))
.Max(d => line.LastIndexOf(d));
Console.WriteLine(index_digit2);
Есть
LastIndexOf
, который вам следовало бы использовать. Но я бы рекомендовал пересмотреть ваш подход. Есть гораздо более эффективные способы сделать это.