Хотя, возможно, не самое чистое решение. Если вы просто рассчитываете на @ (или выполняете регулярные выражения для определения закономерностей) и добавляете это число к x (30), например:
int paramCount = test.Where(c => c == '@').Count();
var index = test.Select((c, i) => new { c, i })
.TakeWhile(q => q.i < x + paramCount)
.Where(q => q.c == ' ')
.Select(q => q.i)
.Last();
редактировать
Чтобы ваш счетчик учитывал только первые 30 символов (исключая '@'), вы можете выполнить агрегирование заранее:
int paramCount = test.Select((c, i) => new { c, i })
.Aggregate(0, (count, s) => s.c == '@' && s.i < x + count ? count + 1 : count);