Вы ищете Enumerable.ElementAt
.
var secondMatch = str.Where(item => item.StartsWith("data")) //consider null-test
.ElementAt(1);
Console.WriteLine(secondMatch); //ToString() is redundant
Поскольку Where
передает свои результаты, это будет эффективно - перечисление исходной последовательности будет прекращено после того, каквторое совпадение (интересующее вас) найдено.
Если вы обнаружите, что неявная гарантия того, что источник будет содержать два совпадения, недействительна, вы можете использоватьElementAtOrDefault
.
var secondMatch = str.Where(item => item.StartsWith("data"))
.ElementAtOrDefault(1);
if(secondMatch == null) // because default(string) == null
{
// There are no matches or just a single match..
}
else
{
// Second match found..
}
Вы могли бы использовать здесь индексирование массива, как вы сказали, но только после загрузки результатов в ... массив.Это, конечно, будет означать, что вся исходная последовательность должна быть перечислена, а совпадения загружены в массив, так что это пустая трата, если вас интересует только второе совпадение.
var secondMatch = str.Where(item => item.StartsWith("data"))
.ToArray()[1]; //ElementAt will will work too