コードには、IResourceConverterを実装するタイプが1つだけあります。これは、次の2つのlinq文が探しているものです。前者はそれを見つけません。後者はそうです。しかし、それらはどちらも同等の構文です(または少なくとも!)。linq puzzle ...同等の構文...同等の結果はありません!
のLINQステートメント1:
List<Type> toInstantiate = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.Where(type => typeof(IResourceConverter).IsAssignableFrom(type)
&& type != typeof(IResourceConverter))
.ToList();
これは、0の結果を返します。
LINQのステートメント2:私は勃発とtoInstantiateは1つの結果を有している。この場合、foreachループ
List<Type> toInstantiate = new List<Type>();
List<Type> allTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.ToList();
foreach (Type t in allTypes)
{
if (typeof(IResourceConverter).IsAssignableFrom(t)
&& t != typeof(IResourceConverter))
toInstantiate.Add(t);
}
と等価をしたwhere句を除いて完全なLINQを残している
...まさに私が期待していただろう。
この奇妙な動作についての説明はありますか?
私は、toInstantiateの1つの結果が実際にIResourceConverterを実装していると仮定していますか?コンテキストをあいまいにしている瞬間に、いくつかの事実を追加/明確化したいかもしれません。 – jrista
申し訳ありません、jrista。はい、IResourceConverterを実装する1つの型があります。これがlinq文が探しているものです。前者はそれを見つけません。後者はそうです。しかし、どちらも同等の構文であるようです。 – Daniel
私はこれもlinqを使用しているが、どこに別の場所を保持し、allTypesからそれを照会する場合にも起こることに気付きました。 –