なぜこれで空のセットが生成されるのですか?
Object[] types = {23, 234, "hello", "test", true, 23};
var newTypes = types.Select(x => x.GetType().Name)
.Where(x => x.GetType().Name.Equals("Int32"))
.OrderBy(x => x);
newTypes.Dump();
あなたがあなたの選択をするとき、あなたは得ていますIEnumerable<String>
。次に、リスト内の各文字列(すべて「文字列」)のタイプを取得し、「Int32」(リスト全体)と等しくない場所でそれらを除外します。エルゴ...リストは空です。
Equalsは問題なく機能しますが、正しくないのはクエリです。リスト内の整数を選択する場合は、次を使用します。
var newTypes = types.Where( x => x.GetType().Name.Equals("Int32") )
.OrderBy( x => x );
操作の順序を逆にします。
var newTypes = types.Where(x => x is int)
.OrderBy(x => x)
.Select(x => x.GetType().Name);
(これも、かなり特殊なものではなく、直接型チェックを使用していることに注意してください.GetType().Name.Equals(…)
)。
LINQの特徴は、SQL用語で考えるのをやめなければならないということです。SQLでは次のように考えます:-
SELECT Stuff
FROM StufF
WHERE Stuff
ORDER BY Stuff
それはあなたのコードがどのように見えるかです。ただし、LINQでは次のように考える必要があります:-
FROM Stuff
WHERE Stuff
SELECT Stuff
ORDER BY Stuff
var newTypes = types.Select(x => x.GetType().Name)
.Where(x => x.Equals("Int32"))
.OrderBy(x => x);
Selectステートメントはコレクション内のすべての値をその値の基になるタイプの名前に変換するため、これは機能しません。結果のコレクションには文字列値のみが含まれるため、Int32という名前は付けられません。