Это сильно зависит от того, что такое «что-то». Если вы можете предположить, что время обработки каждой строки аналогично, вы можете сделать простой расчет:
TimePerLine = Elapsed / LinesProcessed
TotalTime = TimePerLine * TotalLines
TimeRemaining = TotalTime - LinesRemaining * TimePerLine
Либо используйте LINQ:
var value = MyList.First(item => item.name == "foo").value;
(Конечно, это будет только первое совпадение. Есть много вариантов вокруг этого.)
Или используйте Find
вместо FindIndex
:
var value = MyList.Find(item => item.name == "foo").value;
Я бы настоятельно рекомендовал использовать LINQ - в наши дни это гораздо более идиоматический подход.
(Я бы также предложил следовать соглашениям об именах .NET.)
Вы можете использовать Where
для фильтрации и Select
для получения желаемого значения.
MyList.Where(i=>i.name == yourName).Select(j=>j.value);
Я бы использовал .Equals()
для сравнения вместо ==
.
Примерно так:
MyClass item = MyList.Find(item => item.name.Equals("foo"));
В частности, потому что он дает вам такие опции, как StringComparison, что просто потрясающе. Пример:
MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);
Это позволяет вашему коду игнорировать специальные символы, прописные и строчные. Есть еще варианты.
Использование функции Find - более чистый путь.
MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
....
}
Enumerable.First
возвращает элемент вместо индекса. В обоих случаях вы получите исключение, если в списке не появится соответствующий элемент (ваш исходный код выдаст IndexOutOfBoundsException
, когда вы попытаетесь получить элемент с индексом -1, но First
выдаст InvalidOperationException
).
MyList.First(item => string.Equals("foo", item.name)).value