Ну, «потокобезопасный» - это довольно широкий термин. О каком многопоточном использовании вы думаете? Я бы ожидал , что это будет безопасно без какого-либо искажения данных или исключений, если ничего не будет записано в список ...
Теперь, что касается "уродства" анонимных методов ... вы используете C # 3? Если это так, начните использовать лямбда-выражения, которые, как правило, чище:
static List<string> FindNamesStartingWith(string startingText)
{
return Names.FindAll(name => name.StartsWith(startingText));
}
В качестве альтернативы, используя LINQ:
static List<string> FindNamesStartingWith(string startingText)
{
return Names.Where(name => name.StartsWith(startingText)).ToList();
}
Или, если вам необязательно нужен список:
static IEnumerable<string> FindNamesStartingWith(string startingText)
{
return Names.Where(name => name.StartsWith(startingText));
}
Или, если вы предпочитаете выражение запроса:
static IEnumerable<string> FindNamesStartingWith(string startingText)
{
return from name in names
where name.StartsWith(startingText)
select name;
}
Ничто из этого не выглядит для меня как код спагетти. Однако, если вы собираетесь спросить, следует ли вам использовать это или что-то еще, вы должны действительно предложить альтернативу. Вот простой:
static List<string> FindNamesStartingWith(string startingText)
{
List<string> ret = new List<string>();
foreach (string name in Names)
{
if (name.StartsWith(startingText))
{
ret.Add(name);
}
}
return ret;
}
Вы находите это более понятным? Если это так, это нормально - но я подозреваю просто вы не очень знакомы с анонимными функциями, LINQ и т. Д. Как вы можете видеть, кода значительно больше - мне определенно потребуется больше времени, чтобы проверить это. это делает правильно, чем любой из более ранних образцов.