まあ、「スレッドセーフ」はかなり広い用語です。どのようなマルチスレッドの使用を考えていますか? リストに何も書き込まれていない場合、データの破損や例外なく安全であると期待しています...
さて、匿名メソッドの「醜さ」については... 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などにあまり詳しくないだけだと思います。ご覧のとおり、かなり多くのコードがあります。以前のサンプルのいずれか。